Loading the Packages

library(pacman)
#p_install_gh("favstats/favstats")
p_load(tidyverse, haven,sjmisc,
                     forcats, weights, car,
                     countrycode, lavaan,
                     semTools, lavaan.survey,
                     survey, reshape2, favstats,
                     magrittr, skimr, xray)
range01 <- function(x){(x-min(x, na.rm = T))/(max(x, na.rm = T)-min(x, na.rm = T))}

Loading the URLs

afro5_url <- url("https://github.com/favstats/database_delib/raw//master/afro5.RData")
afro6_url <- url("https://github.com/favstats/database_delib/raw//master/afro6.RData")
latino2013_url <- url("https://github.com/favstats/database_delib/raw//master/latino2013.RData")
latino2015_url <- url("https://github.com/favstats/database_delib/raw//master/latino2015.RData")
wvs_raw_url <- url("https://github.com/favstats/database_delib/raw//master/wvs_raw.RData")
americas_url <- url("https://github.com/favstats/database_delib/raw//master/americas.RData")
bolivia_url <- url("https://github.com/favstats/database_delib/raw//master/bolivia.RData")
canada_url <- url("https://github.com/favstats/database_delib/raw//master/canada.RData")
asian_raw_url <- url("https://github.com/favstats/database_delib/raw//master/asian_raw.RData")
myanmar_raw_url <- url("https://github.com/favstats/database_delib/raw//master/myanmar_raw.RData")
mongolia_raw_url <- url("https://github.com/favstats/database_delib/raw//master/mongolia_raw.RData")
philip_raw_url <- url("https://github.com/favstats/database_delib/raw//master/philip_raw.RData")
taiwan_raw_url <- url("https://github.com/favstats/database_delib/raw//master/taiwan_raw.RData")
thai_raw_url <- url("https://github.com/favstats/database_delib/raw//master/thai_raw.RData")
malay_raw_url <- url("https://github.com/favstats/database_delib/raw//master/malay_raw.RData")
singapore_raw_url <- url("https://github.com/favstats/database_delib/raw//master/singapore_raw.RData")
sk_raw_url <- url("https://github.com/favstats/database_delib/raw//master/sk_raw.RData")
cambodia_raw_url <- url("https://github.com/favstats/database_delib/raw//master/cambodia_raw.RData")
ESS_raw_url <- url("https://github.com/favstats/database_delib/blob/master/ESS_raw.Rdata?raw=true")
vdems_start_url <- url("https://github.com/favstats/database_delib/raw//master/vdems_start.Rdata")
qog_url <- url("https://github.com/favstats/database_delib/raw//master/qog.Rdata")

Afrobarometer Data

Afro 5

load(afro5_url)
delete_na_afro <- function(x) {
  x <- Recode(x, "9 = NA;
            98 = NA;
            99 = NA;
            -1 = NA")
  return(x)
} # Funktion um die NAs im Afro Datensatz zu bestimmen
# alle Variablen
afro_5 <- afro5 %>%
  rename(
    educ = Q97, # Variablen umbenennen
    income = Q3B,
    sex = Q101,
    work = Q96,
    trust_gov = Q59A,
    trust_parliament = Q59B,
    trust_police = Q59H,
    trust_courts = Q59J,
    # demtoday = Q46A
  ) %>%
  mutate_at(
    vars(
      income, trust_gov, trust_parliament,
      trust_police, trust_courts, work
    ),
    delete_na_afro
  ) %>% # NAs deleten
  mutate(
    sex = sex - 1, # sex (0/1) codieren
    work = Recode(
      work, # work (0/1) codieren
      "1 = 0;
       2 = 1;
       3 = 1"
    ),
    age = Recode(
      Q1, # missing values l?schen
      "-1 = NA;
      998 = NA;
      999 = NA"
    ),
    # demtoday = Recode(
    #   demtoday,
    #   "-1 = NA;
    #    98 = NA;
    #    99 = NA"
    # ),
    educ = Recode(
      educ,
      "-1 = NA;
       98 = NA;
       99 = NA;
      999 = NA"
    ),
    cntry = to_label(COUNTRY_ALPHA),
    year = as.numeric(format(DATEINTR, "%Y"))
  ) %>%
  select(
    cntry, year, age, sex, income, educ, work, 
    trust_gov, trust_parliament, trust_police, trust_courts
  )
afro_5
save(afro_5, file = "codebooks/singles/afro_5.Rdata")

Afro 6

load(afro6_url)
afro_6 <- afro6 %>%
  rename(
    educ = Q97,
    income = Q4B,
    sex = Q101,
    work = Q95,
    trust_gov = Q52A,
    trust_parliament = Q52B,
    trust_police = Q52H,
    trust_courts = Q52J,
    # demtoday = Q40
  ) %>%
  mutate_at(
    vars(
      income, trust_gov,
      trust_parliament, trust_police,
      trust_courts, work
    ),
    delete_na_afro
  ) %>% # NAs deleten
  mutate(
    sex = sex - 1, # sex (0/1) codieren
    work = Recode(
      work, # work (0/1) codieren
      "1 = 0;
       2 = 1;
       3 = 1"
    ),
    age = Recode(
      Q1, # missing values l?schen
      "-1 = NA;
      998 = NA;
      999 = NA"
    ),
    educ = Recode(
      educ,
      "-1 = NA;
       98 = NA;
       99 = NA;
      999 = NA"
    ),
    # demtoday = Recode(
    #   demtoday,
    #   "8 = NA"
    # ),
    cntry = to_label(COUNTRY_R5List),
    year = as.numeric(format(DATEINTR, "%Y"))
  ) %>%
  #  mutate_at(vars(income, educ, age,
  #                 trust_gov, trust_parliament,
  #                 trust_police, trust_courts),
  #            as.character) %>%
  #  mutate_at(vars(income, educ, age,
  #                 trust_gov, trust_parliament,
  #                 trust_police, trust_courts),
  #            as.numeric) %>%
  select(
    cntry, year, age, sex, income,
    educ, work, #demtoday,
    trust_gov, trust_parliament,
    trust_police, trust_courts
  ) 
afro_6
save(afro_6, file = "codebooks/singles/afro_6.Rdata")

Merging the Data

afro_real <- afro_5 %>% 
  mutate_at(
    vars(
      income, educ,
      trust_gov, trust_parliament,
      trust_police, trust_courts
    ),
    range01
  )
afro_real2 <- afro_6 %>% 
  mutate_at(
    vars(
      income, educ,
      trust_gov, trust_parliament,
      trust_police, trust_courts
    ),
    range01
  )
# length(unique(afro_real$cntry))
# length(unique(afro_real2$cntry))
# table(afro_real2$year)
afro <- rbind(afro_real, afro_real2) %>% as.tbl()
afro

Latino Barometro

Latino 2013

load(latino2013_url)
latino_2013 <- latino2013 %>%
  rename(
    educ = REEDUC_1,
    income = S6,
    # demtoday = P50TGB.A,
    age = S11
  ) %>%
  mutate(
    sex = S10 - 1, # sex variable erstellen
    cntry = to_label(IDENPA), # cntry variable erstellen
    trust_gov = 5 - P26TGB.B,
    trust_parliament = 5 - P26TGB.C,
    trust_police = 5 - P28TGB.B,
    trust_courts = 5 - P26TGB.E,
    year = 2013,
    income = 5 - income,
    work = Recode(
      S19.A,
      "2 = 1;
       3 = 1;
       4 = 0;
       5 = 0;
       6 = 0;
       7 = 0"
    )
  ) %>%
  select(
    cntry, year, age, sex, income, educ, work, 
    trust_gov, trust_parliament, trust_police, trust_courts
  )
latino_2013
save(latino_2013, file = "codebooks/singles/latino_2013.Rdata")

Latino 2015

load(latino2015_url)
latino_2015 <- latino2015 %>%
  mutate(sex = S12 - 1) %>% # sex variable erstellen
  rename(
    educ = REEDUC_1,
    income = S4,
    # demtoday = P17STGBS,
    age = S13
  ) %>%
  mutate(
    trust_gov = 5 - P16ST.G,
    trust_parliament = 5 - P16ST.F,
    trust_police = 5 - P16TGB.B,
    trust_courts = 5 - P16ST.H,
    work = Recode(
      S21.A,
      "2 = 1;
       3 = 1;
       4 = 0;
       5 = 0;
       6 = 0;
       7 = 0"
    ),
    cntry = to_label(IDENPA),
    income = 5 - income,
    year = 2015
  ) %>%
  select(
    cntry, year, age, sex, income, educ, work, 
    trust_gov, trust_parliament, trust_police, trust_courts
  )
latino_2015
save(latino_2015, file = "codebooks/singles/latino_2015.Rdata")

Merging the Data

latino_real <- latino_2013 %>% 
  mutate_at(
    vars(
      income, educ,
      trust_gov, trust_parliament,
      trust_police, trust_courts
    ),
    range01
  )
latino_real2 <- latino_2015 %>% 
  mutate_at(
    vars(
      income, educ,
      trust_gov, trust_parliament,
      trust_police, trust_courts
    ),
    range01
  )
latino <- rbind(latino_real, latino_real2) %>% as.tbl()
latino

World Value Survey

load(wvs_raw_url)
wvs <- wvs_raw %>%
  rename(
    educ = V248,
    income = V239,
    # demtoday = V141,
    age = V242,
    year = V262
  ) %>%
  mutate(
    sex = V240 - 1, # sex variable erstellen
    trust_gov = 5 - V115,
    trust_parliament = 5 - V117,
    trust_police = 5 - V113,
    trust_courts = 5 - V114,
    work = Recode(
      V229,
      "2 = 1;
       3 = 1;
       4 = 0;
       5 = 0;
       6 = 0;
       7 = 0;
       8 = 0"
    ),
    cntry = to_label(V2)
  ) %>%
  select(
    cntry, year, age, sex, income, educ, work, 
    trust_gov, trust_parliament,
    trust_police, trust_courts
  )
wvs
save(wvs, file = "codebooks/singles/wvs.Rdata")

Americas Barometer

Americas Main

load(americas_url)
americas_ <- americas %>%
  mutate(cntry = to_label(pais)) %>%
  select(
    cntry, ocup4a, ed, q10new, q1, q2,
    b10a, b13, b18, b21a, n3, year
  ) %>%
  rename(
    work = ocup4a,
    educ = ed,
    income = q10new,
    sex = q1,
    age = q2,
    trust_courts = b10a,
    trust_parliament = b13,
    trust_police = b18,
    trust_gov = b21a,
    # demtoday = n3
  ) %>%
  mutate(
    sex = sex - 1, # sex variable erstellen
    work = Recode(
      work,
      "2 = 1;
       3 = 1;
       4 = 0;
       5 = 0;
       6 = 0;
       7 = 0"
    )
  ) %>%
  select(
    cntry, year, age, sex, income, educ, work,  
    trust_gov, trust_parliament, trust_police, trust_courts
  )
americas_
save(americas_, file = "codebooks/singles/americas_.Rdata")

Bolivia

load(bolivia_url)
bolivia_ <- bolivia %>%
  mutate(cntry = to_label(pais)) %>%
  select(
    cntry, ocup4a, ed, q10new, q1, q2,
    b10a, b13, b18, b21a, n3, year
  ) %>%
  rename(
    work = ocup4a,
    educ = ed,
    income = q10new,
    sex = q1,
    age = q2,
    trust_courts = b10a,
    trust_parliament = b13,
    trust_police = b18,
    trust_gov = b21a, # viele missing values
    # demtoday = n3
  ) %>%
  mutate(
    sex = sex - 1, # sex variable erstellen
    work = Recode(
      work,
      "2 = 1;
       3 = 1;
       4 = 0;
       5 = 0;
       6 = 0;
       7 = 0"
    )
  ) %>%
  select(
    cntry, year, age, sex, income, educ, work, 
    trust_gov, trust_parliament, trust_police, trust_courts
  )
bolivia_
save(bolivia_, file = "codebooks/singles/bolivia_.Rdata")

Canada

load(canada_url)
canada_ <- canada %>%
  mutate(cntry = to_label(pais)) %>%
  select(
    cntry, exc13, education, q10, q1, q2,
    b10a, b13, b18, b21a, n3, year
  ) %>%
  rename(
    work = exc13,
    educ = education,
    income = q10,
    sex = q1,
    age = q2,
    trust_courts = b10a,
    trust_parliament = b13,
    trust_police = b18,
    trust_gov = b21a,
    # demtoday = n3
  ) %>%
  mutate(
    sex = sex - 1, # sex variable erstellen
    work = work - 1,
    income = ifelse(income == 88, NA, income)
  ) %>%
  select(
    cntry, year, age, sex, income, educ, work,  
    trust_gov, trust_parliament, trust_police, trust_courts
  )
canada_
save(canada_, file = "codebooks/singles/canada_.Rdata")

Merging the Data

americas <- americas_ %>% 
  mutate_at(
    vars(
      income, educ,
      trust_gov, trust_parliament,
      trust_police, trust_courts
    ),
    range01
  )
bolivia <- bolivia_ %>% 
  mutate_at(
    vars(
      income, educ,
      trust_gov, trust_parliament,
      trust_police, trust_courts
    ),
    range01
  )
canada <- canada_ %>% 
  mutate_at(
    vars(
      income, educ,
      trust_gov, trust_parliament,
      trust_police, trust_courts
    ),
    range01
  )
americas <- rbind(americas, bolivia, canada) %>% 
  mutate(cntry = as.character(cntry)) %>% 
  mutate(cntry = ifelse(cntry == "Haití", "Haiti", cntry))
americas
# 
# table(americas$cntry)

Asian Barometer

load(asian_raw_url)
delete_na_asian <- function(x) {
  x <- Recode(
    x,
    "-2 = NA;
      7 = NA;
      8 = NA;
      9 = NA;
     97 = NA;
     98 = NA;
     99 = NA;
     -1 = NA"
  )
  return(x)
} # Funktion um die NAs im asian Datensatz zu bestimmen
asian_3 <- asian_raw %>%
  rename(
    educ = se5,
    trust_gov = q9,
    trust_parliament = q11,
    trust_police = q14,
    trust_courts = q8,
    sex = se2,
    income = se13a,
    work = se9
  ) %>%
  mutate_at(
    vars(
      income, trust_gov, trust_parliament,
      trust_police, trust_courts, work, sex
    ),
    delete_na_asian
  ) %>% # NAs deleten
  mutate(
    trust_gov = 5 - trust_gov,
    trust_parliament = 5 - trust_parliament,
    trust_police = 5 - trust_police,
    trust_courts = 5 - trust_courts,
    sex = sex - 1, # sex (0/1) codieren
    income = Recode(
      income,
      "0 = NA"
    ),
    income = 5 - income,
    work = Recode(
      work, # work (0/1) codieren
      "2 = 0"
    ),
    age = Recode(
      se3a, # missing values l?schen
      "-1 = NA"
    ),
    # demtoday = Recode(
    #   q91,
    #   "-1 = NA;
    #    97 = NA;
    #    98 = NA;
    #    99 = NA"
    # ),
    educ = Recode(
      educ,
      "-1 = NA;
       98 = NA;
       99 = NA"
    ),
    cntry = to_label(country),
    year = as.numeric(format(ir9, "%Y"))
  ) %>%
  select(
    cntry, year, age, sex, income, educ, work, 
    trust_gov, trust_parliament, trust_police, trust_courts
  ) 
asian_3
save(asian_3, file = "codebooks/singles/asian_3.Rdata")

Wave 4

load(myanmar_raw_url)
needed <- function(data) {
  ss <- data %>%
    rename(
      educ = se5,
      trust_gov = q9,
      trust_parliament = q11,
      trust_police = q14,
      trust_courts = q8,
      sex = se2,
      income = se13a,
      work = se9
    ) %>%
    mutate_at(
      vars(
        trust_gov, trust_parliament,
        trust_police, trust_courts, work, sex
      ),
      delete_na_asian
    ) %>% # NAs deleten
    mutate(
      trust_gov = 5 - trust_gov,
      trust_parliament = 5 - trust_parliament,
      trust_police = 5 - trust_police,
      trust_courts = 5 - trust_courts,
      sex = sex - 1, # sex (0/1) codieren
      income = Recode(
        income,
        "0 = NA;
        97 = NA;
        98 = NA;
        99 = NA;
        -1 = NA"
      ),
      work = Recode(
        work, # work (0/1) codieren
        "2 = 0"
      ),
      age = Recode(
        se3_2, # missing values l?schen
        "-1 = NA"
      ),
      # demtoday = Recode(
      #   q94,
      #   "-1 = NA;
      #    97 = NA;
      #    98 = NA;
      #    99 = NA"
      # ),
      educ = Recode(
        educ,
        "-1 = NA;
         98 = NA;
         99 = NA"
      ),
      cntry = to_label(country),
      year = year
    ) %>%
    select(
      cntry, year, age, sex, income, educ, work, 
      trust_gov, trust_parliament, trust_police, trust_courts
    )
  
  return(ss)
}
myanmar <- needed(myanmar_raw)
load(mongolia_raw_url)
load(philip_raw_url)
load(taiwan_raw_url)
load(thai_raw_url)
load(malay_raw_url)
load(singapore_raw_url)
load(sk_raw_url)
load(cambodia_raw_url)
mongolia  <- needed(mongolia_raw)
philip    <- needed(philip_raw)
thai      <- needed(thai_raw)
malay     <- needed(malay_raw)
singapore <- needed(singapore_raw) # Singapore hat extrem viele Missing values
sk        <- needed(sk_raw)
cambodia  <- needed(cambodia_raw)
save(myanmar, file = "codebooks/singles/myanmar.Rdata")
save(mongolia, file = "codebooks/singles/mongolia.Rdata")
save(philip, file = "codebooks/singles/philip.Rdata")
save(thai, file = "codebooks/singles/thai.Rdata")
save(malay, file = "codebooks/singles/malay.Rdata")
save(singapore, file = "codebooks/singles/singapore.Rdata")
save(sk, file = "codebooks/singles/sk.Rdata")
save(cambodia, file = "codebooks/singles/cambodia.Rdata")

Sonderfall Taiwan

# Taiwan Problem: Income only has 3 categories
taiwan <- taiwan_raw %>%
    rename(
      educ = se5,
      trust_gov = q9,
      trust_parliament = q11,
      trust_police = q14,
      trust_courts = q8,
      sex = se2,
      income = se14a,
      work = se9
    ) %>%
    mutate_at(
      vars(
        income, trust_gov, trust_parliament,
        trust_police, trust_courts, work, sex
      ),
      delete_na_asian
    ) %>% # NAs deleten
    mutate(
      trust_gov = 5 - trust_gov,
      trust_parliament = 5 - trust_parliament,
      trust_police = 5 - trust_police,
      trust_courts = 5 - trust_courts,
      sex = sex - 1, # sex (0/1) codieren
      income = Recode(
        4 - income,
        "8 = NA;
         9 = NA"
      ),
      work = Recode(
        work, # work (0/1) codieren
        "2 = 0"
      ),
      age = Recode(
        se3_2, # missing values l?schen
        "-1 = NA"
      ),
      # demtoday = Recode(
      #   q94,
      #   "-1 = NA;
      #    97 = NA;
      #    98 = NA;
      #    99 = NA"
      # ),
      educ = Recode(
        educ,
        "-1 = NA;
         98 = NA;
         99 = NA"
      ),
      cntry = to_label(country),
      year = year
    ) %>%
    select(
      cntry, year, age, sex, income, educ, work,  
      trust_gov, trust_parliament, trust_police, trust_courts
    )
save(taiwan, file = "codebooks/singles/taiwan.Rdata")

Merging Data

asian_3 %<>%
    mutate_at(
      vars(
        income, educ,
        trust_gov, trust_parliament,
        trust_police, trust_courts
      ),
      range01
    )
myanmar %<>%
    mutate_at(
      vars(
        income, educ,
        trust_gov, trust_parliament,
        trust_police, trust_courts
      ),
      range01
    )
mongolia %<>%
    mutate_at(
      vars(
        income, educ,
        trust_gov, trust_parliament,
        trust_police, trust_courts
      ),
      range01
    )
philip %<>%
    mutate_at(
      vars(
        income, educ,
        trust_gov, trust_parliament,
        trust_police, trust_courts
      ),
      range01
    )  
taiwan %<>%
    mutate_at(
      vars(
        income, educ,
        trust_gov, trust_parliament,
        trust_police, trust_courts
      ),
      range01
    )  
thai %<>%
    mutate_at(
      vars(
        income, educ,
        trust_gov, trust_parliament,
        trust_police, trust_courts
      ),
      range01
    )
malay %<>%
    mutate_at(
      vars(
        income, educ,
        trust_gov, trust_parliament,
        trust_police, trust_courts
      ),
      range01
    )
singapore %<>%
    mutate_at(
      vars(
        income, educ,
        trust_gov, trust_parliament,
        trust_police, trust_courts
      ),
      range01
    )
sk %<>%
    mutate_at(
      vars(
        income, educ,
        trust_gov, trust_parliament,
        trust_police, trust_courts
      ),
      range01
    )
cambodia %<>%
    mutate_at(
      vars(
        income, educ,
        trust_gov, trust_parliament,
        trust_police, trust_courts
      ),
      range01
    )
asian <- rbind(
  asian_3, myanmar, cambodia, sk, singapore, malay, thai, taiwan, philip,
  cambodia, mongolia
) %>% as.tbl()
asian

European Social Survey

load(ESS_raw_url)
ESS <- ESS_raw %>%
  rename(
    # demtoday = dmcntov,
    age = agea,
    year = inwyys,
    trust_gov = trstplt,
    trust_parliament = trstprl,
    trust_police = trstplc,
    trust_courts = trstlgl
  ) %>%
  mutate(
    income = 5 - hincfel,
    educ = Recode(
      eisced,
      "55 = NA"
    ),
    work = ifelse(mnactic == 1, 1, 0),
    sex = gndr - 1, # sex variable erstellen
    cntry = to_label(cntry)
  ) %>%  
  select(
    cntry, year, age, sex, income, educ, work, trust_gov, trust_parliament,
    trust_police, trust_courts
  )
ESS
save(ESS, file = "codebooks/singles/ESS.Rdata")

Merging Everything

afro %<>% 
  mutate(survey = rep("afro", nrow(afro))) %>% 
  mutate(cntry = countrycode(cntry, "country.name", "country.name")) 
latino %<>%  
  mutate(survey = rep("latino", nrow(latino))) %>% 
  mutate(cntry = countrycode(cntry, "country.name", "country.name"))
americas %<>%  
  mutate(survey = rep("americas", nrow(americas))) %>% 
  mutate(cntry = countrycode(cntry, "country.name", "country.name"))
asian %<>%  
  mutate(survey = rep("asian", nrow(asian))) %>% 
  mutate(cntry = countrycode(cntry, "country.name", "country.name"))
wvs %<>%  
  mutate(survey = rep("wvs", nrow(wvs))) %>% 
  mutate(cntry = countrycode(cntry, "country.name", "country.name")) %>%
    mutate_at(
      vars(
        income, educ,
        trust_gov, trust_parliament,
        trust_police, trust_courts
      ),
      range01
    )
ESS %<>%  
  mutate(survey = rep("ESS", nrow(ESS))) %>% 
  mutate(cntry = countrycode(cntry, "country.name", "country.name")) %>%
    mutate_at(
    vars(
      income, educ,
      trust_gov, trust_parliament,
      trust_police, trust_courts
    ),
    stdz
  ) %>%
    mutate_at(
      vars(
        income, educ,
        trust_gov, trust_parliament,
        trust_police, trust_courts
      ),
      range01
    ) 
unique(ESS$cntry)
 [1] "Albania"        "Belgium"        "Bulgaria"       "Switzerland"    "Cyprus"         "Czechia"       
 [7] "Germany"        "Denmark"        "Estonia"        "Spain"          "Finland"        "France"        
[13] "United Kingdom" "Hungary"        "Ireland"        "Israel"         "Iceland"        "Italy"         
[19] "Lithuania"      "Netherlands"    "Norway"         "Poland"         "Portugal"       "Russia"        
[25] "Sweden"         "Slovenia"       "Slovakia"       "Ukraine"        "Kosovo"        
unique(asian$cntry)
 [1] "Japan"               "Hong Kong SAR China" "South Korea"         "China"              
 [5] "Mongolia"            "Philippines"         "Taiwan"              "Thailand"           
 [9] "Indonesia"           "Singapore"           "Vietnam"             "Cambodia"           
[13] "Malaysia"            "Myanmar (Burma)"    
unique(wvs$cntry)
 [1] "Algeria"                 "Argentina"               "Armenia"                 "Australia"              
 [5] "Azerbaijan"              "Bahrain"                 "Belarus"                 "Brazil"                 
 [9] "Colombia"                "Cyprus"                  "Chile"                   "China"                  
[13] "Ecuador"                 "Egypt"                   "Estonia"                 "Georgia"                
[17] "Germany"                 "Ghana"                   "Hong Kong SAR China"     "India"                  
[21] "Iraq"                    "Japan"                   "Jordan"                  "Kazakhstan"             
[25] "Kuwait"                  "Kyrgyzstan"              "Lebanon"                 "Libya"                  
[29] "Malaysia"                "Mexico"                  "Morocco"                 "Netherlands"            
[33] "New Zealand"             "Nigeria"                 "Pakistan"                "Palestinian Territories"
[37] "Peru"                    "Philippines"             "Poland"                  "Qatar"                  
[41] "Romania"                 "Russia"                  "Rwanda"                  "Singapore"              
[45] "Slovenia"                "South Korea"             "South Africa"            "Spain"                  
[49] "Sweden"                  "Taiwan"                  "Thailand"                "Trinidad & Tobago"      
[53] "Tunisia"                 "Turkey"                  "Ukraine"                 "United States"          
[57] "Uruguay"                 "Uzbekistan"              "Yemen"                   "Zimbabwe"               
unique(latino$cntry)
 [1] "Argentina"          "Bolivia"            "Brazil"             "Colombia"           "Costa Rica"        
 [6] "Chile"              "Ecuador"            "El Salvador"        "Spain"              "Guatemala"         
[11] "Honduras"           "Mexico"             "Nicaragua"          "Panama"             "Paraguay"          
[16] "Peru"               "Dominican Republic" "Uruguay"            "Venezuela"         
unique(americas$cntry)
 [1] "Bahamas"            "Barbados"           "Belize"             "Brazil"             "Colombia"          
 [6] "Costa Rica"         "Dominican Republic" "Ecuador"            "El Salvador"        "Guatemala"         
[11] "Guyana"             "Haiti"              "Honduras"           "Jamaica"            "Mexico"            
[16] "Nicaragua"          "Panama"             "Paraguay"           "Peru"               "Suriname"          
[21] "Trinidad & Tobago"  "Uruguay"            "Bolivia"            "Canada"            
unique(afro$cntry)
 [1] "Algeria"             "Burundi"             "Benin"               "Burkina Faso"       
 [5] "Botswana"            "Cameroon"            "Côte d’Ivoire"       "Cape Verde"         
 [9] "Egypt"               "Ghana"               "Guinea"              "Kenya"              
[13] "Lesotho"             "Liberia"             "Madagascar"          "Mauritius"          
[17] "Mali"                "Malawi"              "Mozambique"          "Morocco"            
[21] "Namibia"             "Niger"               "Nigeria"             "South Africa"       
[25] "Senegal"             "Sierra Leone"        "Sudan"               "Swaziland"          
[29] "Tanzania"            "Togo"                "Tunisia"             "Uganda"             
[33] "Zambia"              "Zimbabwe"            "Gabon"               "São Tomé & Príncipe"
merged <- rbind(wvs, latino, afro, americas, asian, ESS)
merged %<>%
  # create dummies
  mutate(
    wvs = ifelse(survey == "wvs", 1, 0),
    afro = ifelse(survey == "afro", 1, 0),
    latino = ifelse(survey == "latino", 1, 0),
    americas = ifelse(survey == "americas", 1, 0),
    asian = ifelse(survey == "asian", 1, 0),
    ESS = ifelse(survey == "ESS", 1, 0)
  ) %>%
  # filter bad countries
  filter(!(cntry == "Egypt" & year == 2013)) %>% # exclude Egypt 2013
  filter(!(cntry == "Libya" & year == 2014)) %>% # exclude Libya 2014
  filter(!(cntry == "Mali" & year == 2012)) %>% # exclude Mali 2012
  filter(!(cntry == "Yemen" & year == 2012)) %>% # exclude Yemen 2012
  filter(!(cntry == "Palestine, State of" & year == 2013)) # exclude Palestine 2013
# adding weight
not_character <- function(x) {
  !(is.character(x))
}
merged %<>%
  group_by(cntry) %>%
  tally() %>%
  mutate(weight = 1000 / n) %>%
  select(cntry, weight) %>%
  left_join(merged, "cntry") %>% 
  mutate_if(not_character, as.numeric)
# select(cntry, year) %>%
# unique %>%
# View
merged
table(merged$wvs)

     0      1 
306779  82618 
table(merged$afro)

     0      1 
286241 103156 
table(merged$latino)

     0      1 
346484  42913 
table(merged$americas)

     0      1 
315547  73850 
table(merged$asian)

     0      1 
357210  32187 
table(merged$ESS)

     0      1 
334724  54673 

Factor Analysis

#TODO todor::
merged %>% 
  select(trust_gov, trust_parliament, 
           trust_police, trust_courts) %>% 
  psych::alpha()

Reliability analysis   
Call: psych::alpha(x = .)

  raw_alpha std.alpha G6(smc) average_r S/N    ase mean   sd
      0.81      0.81    0.78      0.52 4.3 0.0005 0.49 0.26

 lower alpha upper     95% confidence boundaries
0.81 0.81 0.81 

 Reliability if an item is dropped:
                 raw_alpha std.alpha G6(smc) average_r S/N alpha se
trust_gov             0.77      0.77    0.69      0.52 3.3  0.00065
trust_parliament      0.74      0.74    0.67      0.49 2.9  0.00072
trust_police          0.79      0.79    0.73      0.56 3.8  0.00057
trust_courts          0.75      0.75    0.69      0.50 3.0  0.00070

 Item statistics 
                      n raw.r std.r r.cor r.drop mean   sd
trust_gov        364295  0.81  0.80  0.71   0.63 0.49 0.34
trust_parliament 368645  0.82  0.82  0.75   0.67 0.45 0.32
trust_police     382631  0.77  0.76  0.63   0.57 0.52 0.33
trust_courts     372752  0.82  0.82  0.73   0.66 0.50 0.32
merged %>% 
  select(trust_gov, trust_parliament, 
           trust_police, trust_courts) %>% 
  psych::KMO()
Kaiser-Meyer-Olkin factor adequacy
Call: psych::KMO(r = .)
Overall MSA =  0.76
MSA for each item = 
       trust_gov trust_parliament     trust_police     trust_courts 
            0.75             0.74             0.79             0.77 
merged %<>% 
  select(trust_gov, trust_parliament, 
           trust_police, trust_courts) %>% 
  mutate_all(as.numeric) %>% 
  psych::fa(weight = merged$weight) %>% 
  psych::predict.psych(data = merged %>% 
  select(trust_gov, trust_parliament, 
           trust_police, trust_courts)) %>%
  as.data.frame() %>%
  transmute(gov_trust = range01(MR1)) %>%
  cbind(merged)
merged

Some Recoding

Level 2 Data

V-Dem

load(vdems_start_url)
vdems_sub <- vdems_start %>% filter(year %in% 2000:2010)
#tibble(id = 1:1896)
#table(vdems_sub$country_name)
vdem <- vdems_start %>%
  filter(year %in% 2000:2010) %>% 
  group_by(country_name) %>%
  tally %>%
  mutate(cntry = unique(country_name)) %>%
  #DCI Variables
  mutate(delib10 = vdems_sub %>%
           dcast(country_name ~ year, 
                 value.var=c("v2xdl_delib")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(consult10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("v2dlconslt")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(reason10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("v2dlreason")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(common10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("v2dlcommon")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(countr10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("v2dlcountr")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(engage10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("v2dlengage")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(delibdem10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("v2x_delibdem")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  # Control Variables
  mutate(polity10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("e_fh_ipolity2")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(poly10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("v2x_polyarchy")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(rol10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("e_wbgi_rle")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
#  mutate(gdp10 = vdems_sub %>% filter(year %in% 2000:2008) %>% 
#           dcast(country_name ~ year, 
#                 value.var=c("e_GDP_Per_Cap_Haber_Men_2")) %>% 
#           select(`2000`:`2010`) %>%
#           rowMeans) %>%
  mutate(riw10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("e_v2x_regime_ci")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(corecivil10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("v2xcs_ccsi")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(pop10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("e_mipopula")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(corruption10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("v2x_corr")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(polkill10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("v2x_clphy")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(educ10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("e_peaveduc")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(equal_distrib10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("v2xeg_eqdr")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%  
   mutate(div_party10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("v2x_divparctrl")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%  
   mutate(div_power10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("v2x_feduni")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%  
   mutate(accountability10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("v2x_accountability")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%    
   mutate(directdem10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("v2xdd_dd")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%      
   mutate(eq_educ10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("v2peedueq")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%       
    mutate(eq_health10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("v2pehealth")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%  
     mutate(controlcorruption10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("e_wbgi_cce")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%  
     mutate(eff10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("e_wbgi_gee")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>% 
     mutate(stability10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("e_wbgi_pse")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%   
     mutate(unified_dem10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("e_uds_mean")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%     
     mutate(gdp_growth10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("e_migdpgrolns")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%       
     mutate(infla10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("e_miinflat")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%       
     # mutate(lifeexp10 = vdems_sub %>% 
     #       dcast(country_name ~ year, 
     #             value.var=c("e_pelifeex")) %>%
     #       select(`2000`:`2010`) %>%
     #       rowMeans) %>%        
    mutate(urbanratio10 = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("e_miurbani")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%        
  
#  mutate(gini10 = vdems_sub %>% 
#           dcast(country_name ~ year, 
#                 value.var=c("e_peginiwi")) %>%
#           select(`2000`:`2010`) %>%
#           rowMeans) %>% 
  # Dummy variables
  mutate(pol_round = round(polity10 * 2 - 10)) %>% 
  mutate(polity_demdummy = ifelse(pol_round > 5, 1, 0)) %>% 
  mutate(polity_anodummy = ifelse(pol_round >= -5 & pol_round <= 5, 1, 0)) %>% 
  mutate(polity_autodummy = ifelse(pol_round < -5, 1, 0)) %>% 
  mutate(regime = case_when(
    polity_autodummy == 1 ~ "auto",
    polity_anodummy == 1 ~ "ano",
    polity_demdummy == 1 ~ "demo"
    )
  ) %>%
  mutate(regime = factor(regime, levels = c("demo", "ano", "auto"))) %>% 
  mutate(cntry = ifelse(str_detect(cntry, "ietnam"), "Vietnam", cntry)) %>%   
  mutate(cntry = countrycode(cntry,"country.name","country.name")) %>% 
  select(-n)
# vdem$cntry[40] <- "Viet Nam"
# ifelse(round(vdem$polity10 * 2 -10) >= -5 & round(vdem$polity10 * 2 -10) <= 5, 1, 0)
table(vdem$regime)

demo  ano auto 
  72   77   18 
print(levels(vdem$regime)) 
[1] "demo" "ano"  "auto"
# DURATION OF REGIME?! e_democracy_duration

QoG

load("data/qog.Rdata")
count_na <- function(x) sum(is.na(x))
qog10 <- qog %>% 
  filter(year %in% 2000:2010) %>% 
  mutate(count_na = apply(., 1, count_na)) %>% 
  filter(count_na < 2050) %>%  
  mutate(cntry = countrycode(ccodealp, "iso3c","country.name"))
Some values were not matched unambiguously: SCG
qog10 <- qog %>% 
  filter(year %in% 2000:2010) %>% 
  mutate(count_na = apply(., 1, count_na)) %>% 
  filter(count_na < 2050) %>%  
  mutate(cntry = countrycode(ccodealp, "iso3c","country.name")) %>% 
  group_by(cntry) %>%
  tally() %>% 
  mutate(ethnic10 = qog10 %>%
           dcast(cntry ~ year, 
                 value.var = c("al_ethnic"), 
          fun.aggregate = mean) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>% 
  mutate(gdp10 = qog10 %>%
           dcast(cntry ~ year, 
                 value.var = c("gle_cgdpc"), 
          fun.aggregate = mean) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>% 
  mutate(corrupt10 = qog10 %>%
           dcast(cntry ~ year, 
                 value.var = c("bci_bci"), 
          fun.aggregate = mean) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>% 
  mutate(lifeexp10 = qog10 %>%
           dcast(cntry ~ year, 
                 value.var = c("ihme_lebs0001"), 
          fun.aggregate = mean) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>% 
  mutate(mortinf10 = qog10 %>%
           dcast(cntry ~ year, 
                 value.var = c("wdi_mortinf"), 
          fun.aggregate = mean) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>% 
  mutate(urbanpop10 = qog10 %>%
           dcast(cntry ~ year,
                 value.var = c("wdi_popurb"),
          fun.aggregate = mean) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%
  mutate(qogpop10 = qog10 %>%
           dcast(cntry ~ year,
                 value.var = c("pwt_pop"),
          fun.aggregate = mean) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>%  
  # mutate(work10 = qog10 %>%
  #          dcast(cntry ~ year, 
  #                value.var = c("wdi_unemp"), 
  #         fun.aggregate = mean) %>%
  #          select(`2000`:`2010`) %>%
  #          rowMeans) %>% 
  mutate(frac_elites10 =  qog10 %>% filter(year %in% 2004:2010) %>%
           dcast(cntry ~ year, 
                 value.var = c("ffp_fe"), 
          fun.aggregate = mean) %>%
           select(`2004`:`2010`) %>%
           rowMeans) %>% 
  mutate(glob10 = qog10 %>%
           dcast(cntry ~ year, 
                 value.var = c("dr_ig"), 
          fun.aggregate = mean) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>% 
  select(-n)
Some values were not matched unambiguously: SCG
#  mutate(al_ethnic = as.numeric(al_ethnic)) %>% 
  
qog10
# qog10 %>%
#   # select(cntry, cname, ccodecow) %>%
#   group_by(cntry) %>%
#   slice(1) %>%
#   arrange(cntry)
# # 
# # countrycode()
# 
# qog %>% 
#   filter(year %in% 2000:2010) %>% 
#   filter(str_detect(cname, "Germany")) %>% 
#   select(cname, al_ethnic, gle_cgdpc)
# 
# 
qog %>%
  filter(year %in% 2000:2010) %>%
  filter(str_detect(cname, "Taiwan")) %>%
  select(cname, wdi_lifexp)
# options(scipen=999)

Gini Coefficient

load("data/swiid6_1.rda")
gini <- swiid_summary
gini_sub <- gini %>% filter(year %in% 2000:2010)
gini %<>% 
  filter(year %in% 2000:2010) %>% 
  group_by(country) %>%
  tally %>%
  mutate(cntry = unique(country)) %>%
  #DCI Variables
  mutate(gini10 = gini_sub %>%
           dcast(country ~ year, 
                 value.var = c("gini_disp")) %>%
           select(`2000`:`2010`) %>%
           rowMeans) %>% 
  mutate(cntry = countrycode(cntry,"country.name","country.name")) %>%  
  select(cntry, gini10)
Some values were not matched unambiguously: Micronesia

Merging Time

Level 2

level2 <- merge(x = qog10, y = vdem, by = "cntry") %>% merge(gini, by = "cntry")
level2

Ind + Country

# load("data/level1.Rdata")
combined <- merge(x = merged, y = level2, by = "cntry") %>% 
              mutate(cntryears = paste(cntry, year))
#combined$cntryears <- paste(combined$cntry,combined$year)
vdem2 <- vdems_start %>%
  filter(year %in% 2010:2015) %>% 
  mutate(country_name = ifelse(str_detect(country_name, "ietnam"), "Vietnam", country_name)) %>%   
  mutate(cntry = countrycode(country_name,"country.name","country.name")) #%>% 
 # select(cntry, country_name)
# vdem2$cntry[996] <- "Viet Nam"
# vdem2$cntry[997] <- "Viet Nam"
# vdem2$cntry[998] <- "Viet Nam"
# vdem2$cntry[999] <- "Viet Nam"
# vdem2$cntry[1000] <- "Viet Nam"
# vdem2$cntry[1001] <- "Viet Nam"
# v2x_freexp_thick freedom of expression
combined <- vdem2 %>% 
  mutate(cntryears = paste(cntry, year)) %>% 
  mutate(discuss_unsel = v2xcl_disc) %>% 
  select(cntryears, discuss_unsel) %>% 
  merge(combined, by = "cntryears") %>% 
                  plyr::ddply(~cntry,
                        summarise, 
                        discuss = mean(discuss_unsel, na.rm=T)) %>% 
  merge(combined, by = "cntry")
save(combined,file = "data/combined.Rdata")
save(level2,file = "data/level2.Rdata")

Weighting, Remove NAs and Normalizing

Individual Level

Macro Level

macro  <- combined %>% 
                # mutate(gov_trust = range01(gov_trust)) %>% 
                # mutate(demtoday = range01(demtoday)*100) %>% 
                group_by(cntry) %>% 
                dplyr::summarise(
                  mean_gov = mean(gov_trust, na.rm=T),
                  mean_gov_low = mean(gov_trust_low, na.rm=T),
                  mean_gov_high = mean(gov_trust_high, na.rm=T),
                  discuss = mean(discuss, na.rm=T),
                  ) %>% 
                merge(level2, by = "cntry") %>% 
                zap_inf() %>% 
                mutate(urbanratio10 = ifelse(is.na(urbanratio10), urbanpop10, urbanratio10)) %>% 
                mutate(pop10 = ifelse(is.na(pop10), qogpop10 * 1000000, pop10)) %>% 
                select(cntry, mean_gov, mean_gov_low, mean_gov_high, 
                       delib10:polity10, 
                       pol_round, polity_demdummy, polity_anodummy, 
                       polity_autodummy, polity_autodummy,
                       regime, discuss, #discuss_round, 
                       gdp10, corrupt10, lifeexp10, pop10, 
                       poly10, riw10, unified_dem10, urbanratio10) %>% 
                drop_na(mean_gov) %>% 
                mutate(count_na = apply(., 1, count_na)) %>% 
  mutate_at(vars(delib10:polity10, polity_demdummy:polity_autodummy, discuss:urbanratio10), range01)
macro_dem <- macro %>% 
                      filter(polity_demdummy == 1) %>% 
  mutate_at(vars(delib10:polity10, polity_demdummy:polity_autodummy, discuss:urbanratio10), range01)
macro_aut <- macro %>% 
                      filter(polity_demdummy == 0) %>% 
  mutate_at(vars(delib10:polity10, polity_demdummy:polity_autodummy, discuss:urbanratio10), range01)
# table_stuff2<-subset(table_stuff,
#                      !is.na(table_stuff$regime) &
#                        table_stuff$cntry!="Qatar" &
#                       table_stuff$cntry!="Uzbekistan")
save(macro, file = "data/macro.Rdata")
save(macro_dem, file = "data/macro_dem.Rdata")
save(macro_aut, file = "data/macro_aut.Rdata")

Crap

SEM Index

merged2 <- merged %>%
  mutate(gov_trust = trust_gov + trust_parliament + 
           trust_police + trust_courts) %>%
  filter(!is.na(gov_trust))

merged3 <- merged %>%
  mutate(gov_trust = trust_gov + trust_parliament + 
           trust_police + trust_courts) %>%
  filter(is.na(gov_trust))

svy.df <- survey::svydesign(id= ~1,
                              weights= ~weight,
                              data= merged) 

model <- '# measurement model 1
gov_trust2 =~ 1*trust_gov + trust_parliament + 
trust_police + trust_courts
trust_gov ~~ trust_parliament
'

merged <- merged %>%
  mutate_at(vars(trust_gov, trust_parliament,
                 trust_police, trust_courts), as.numeric)

# cor(na.omit(data.frame(merged$trust_gov,
#               merged$trust_police,
#               merged$trust_courts,
#               merged$trust_parliament,
#               merged$demtoday)))

lavaan_model1<-cfa(model, meanstructure = T, 
                   data = as.data.frame(merged),
                   estimator= "MLM")

fit_a1<-lavaan.survey(lavaan_model1, 
            estimator= "MLM", survey.design=svy.df)
summary(fit_a1, standardized=TRUE,fit.measures = TRUE, rsq = T)

merged4<-cbind(merged2, predict(fit_a1, newdata = merged2))
merged4$gov_trust2<-range01(merged4$gov_trust2)

# head(merged4)

merged<-plyr::rbind.fill(merged3,merged4)
merged$gov_trust<-merged$gov_trust2
head(merged)

compare_cntry<-data.frame(table(merged$cntry,merged$year))
compare_cntry<-tidyr::spread(compare_cntry,Var2,Freq)
compare_cntry[compare_cntry==0]<-100000
#compare_cntry<-na.omit(compare_cntry)
indie<-as.numeric(apply(compare_cntry[,-1],1,sum))
compare_cntry$double<-indie<900000
compare_cntry[compare_cntry==100000]<-0
compare_cntry2 <- subset(compare_cntry,compare_cntry$double==TRUE)

compare_cntry3 <- subset(merged,merged$cntry %in% compare_cntry2$Var1)

y1<-subset(compare_cntry3,compare_cntry3$cntry=="Belize" &
                      compare_cntry3$year==2012)$gov_trust

y2<-subset(compare_cntry3,compare_cntry3$cntry=="Belize" &
         compare_cntry3$year==2014)$gov_trust

t.test(y1,y2)

y1<-subset(compare_cntry3,compare_cntry3$cntry=="Bolivia (Plurinational State of)" &
             compare_cntry3$year==2012)$gov_trust

y2<-subset(compare_cntry3,compare_cntry3$cntry=="Bolivia (Plurinational State of)" &
             compare_cntry3$year==2013)$gov_trust

t.test(y1,y2)

y1<-subset(compare_cntry3,compare_cntry3$cntry=="South Africa" &
             compare_cntry3$year==2011)$gov_trust

y2<-subset(compare_cntry3,compare_cntry3$cntry=="South Africa" &
             compare_cntry3$year==2013)$gov_trust

t.test(y1,y2)

       
subset(merged,merged$year==2012)

library(dplyr)
compare_cntry4 <- compare_cntry3 %>%
  group_by(cntry,year) %>%
  summarise_all(funs(mean(., na.rm=TRUE)))

compare_cntry4$cntryear<-paste(compare_cntry4$cntry,compare_cntry4$year)
  
as.data.frame(compare_cntry4[,c(17,8)])
  
?ddply
head(afro)

afrocntry<-unique(afro$cntry)
latinocntry<-unique(latino2013$cntry)
arabcntry<-unique(arab3$cntry)
wvscntry<-unique(wvs$cntry)

cntry_table<- data.frame(as.character(wvscntry),
                         c(as.character(arabcntry),rep("-",48)),
                         c(as.character(latinocntry),rep("-",41)),
                         c(as.character(afrocntry),rep("-",24)))

colnames(cntry_table) <- c("wvs","arab","latino","afro")

arrange(cntry_table, wvs, afro)



table(combined$politcat.x)
mplusdata <- combined %>% dplyr::select(cntry, delib10, 
                                        trust_gov, trust_parliament, 
                                        trust_police,trust_courts,weight)
mplusdata <- na.omit(mplusdata)
mplusdata$cntry <- as.numeric(mplusdata$cntry)
write_csv(mplusdata, path = "mplusdata.csv", col_names = F)

mplusdata2 <- combined %>% dplyr::select(cntry, delib10, 
                                        gov_trust,weight)
mplusdata2 <- na.omit(mplusdata2)
mplusdata2$cntry <- as.numeric(mplusdata2$cntry)
write_csv(mplusdata2, path = "mplusdat2a.csv", col_names = F)

mplusdata2_dem <- combined_dem %>% dplyr::select(cntry, delib10, 
                                         gov_trust,weight)
mplusdata2_dem <- na.omit(mplusdata2_dem)
mplusdata2_dem$cntry <- as.numeric(mplusdata2_dem$cntry)
write_csv(mplusdata2_dem, path = "mplusdat2_dema.csv", col_names = F)

mplusdata2_aut <- combined_aut %>% dplyr::select(cntry, delib10, 
                                         gov_trust,weight)
mplusdata2_aut <- na.omit(mplusdata2_aut)
mplusdata2_aut$cntry <- as.numeric(mplusdata2_aut$cntry)
write_csv(mplusdata2_aut, path = "mplusdat2_auta.csv", col_names = F)

combined <- merge(combined, physi2_s, by = "cntry")

combined_dem <- subset(combined,combined$polity_demdummy==1)

mplusdata_dem <- combined_dem %>% dplyr::select(cntry, delib10, 
                                        trust_gov, trust_parliament, 
                                        trust_police,trust_courts,weight)
mplusdata_dem <- na.omit(mplusdata_dem)
mplusdata_dem$cntry <- as.numeric(mplusdata_dem$cntry)
write_csv(mplusdata_dem, path = "mplusdata_dem.csv", col_names = F)


combined_aut <- subset(combined,combined$polity_demdummy==0)

mplusdata_aut <- combined_aut %>% dplyr::select(cntry, delib10, 
                                                trust_gov, trust_parliament, 
                                                trust_police,trust_courts,weight)
mplusdata_aut <- na.omit(mplusdata_aut)
mplusdata_aut$cntry <- as.numeric(mplusdata_aut$cntry)
write_csv(mplusdata_aut, path = "mplusdata_aut.csv", col_names = F)


#data_wids <- dcast(merged, cntry~year, 
#                    value.var=c("year"))
#data_wids2 <- as.data.frame(lapply(data_wids[,-1],function(n) 0<n))
#data_wids3 <- as.data.frame(apply(data_wids2,2,as.numeric))
#data_wids3 <- cbind(data_wids[,1],data_wids3)
#names(data_wids3)[1]<-"cntry"
#table_stuff <- merge(data_wids3 ,table_stuff, by="cntry")

#table_stuff$polity10[table_stuff$cntry=="Tunisia"] <- 5.32382
#table_stuff2$polity10[table_stuff2$cntry=="Tunisia"] <- 5.32382

head(table_stuff)
cor(na.omit(data.frame(table_stuff$legit,table_stuff$legit2,table_stuff$legit3,
                       table_stuff$mean_gov)))

table_stuff$gni <- table_stuff$gni_c

table_stuff$gni_c[table_stuff$gni <= 1025] <- "low"
table_stuff$gni_c[table_stuff$gni > 1026 & table_stuff$gni <= 4035] <- "lower-middle"
table_stuff$gni_c[table_stuff$gni > 4036 & table_stuff$gni <= 12475] <- "upper-middle"
table_stuff$gni_c[table_stuff$gni > 12475] <- "high"

table_stuff$gni_c2 <- table_stuff$gni_c

table_stuff$gni_c2[table_stuff$gni_c == "lower-middle"] <- "low"
table_stuff$gni_c2[table_stuff$gni_c == "upper-middle"] <- "high"

table(table_stuff$gni_c)
table(table_stuff$gni_c2)

The cut-off points are HDI of less than 0.550
for low human development, 0.550-0.699 for medium human
development, 0.700-0.799 for high human development and
0.800 or greater for very high human development.

#table_stuff$hdi_c <- table_stuff$hdi

#table_stuff$hdi_c[table_stuff$hdi < 0.550] <- "low"
#table_stuff$hdi_c[table_stuff$hdi >= 0.550 & table_stuff$hdi <= 0.699] <- "medium"
#table_stuff$hdi_c[table_stuff$hdi >= 0.700 & table_stuff$hdi <= 0.899] <- "high"
#table_stuff$hdi_c[table_stuff$hdi >= 0.90] <- "very high"

#table(table_stuff$hdi_c)



table(round(table_stuff$terror))

table_stuff$mean_gov2 <- table_stuff$mean_gov
table_stuff$mean_gov2[is.na(table_stuff$mean_gov2)]<-999

table_stuff$mean_gov3 <- table_stuff$mean_gov
table_stuff$mean_gov3[is.na(table_stuff$mean_gov3)]<-999

table_stuff$mean_gov4 <- table_stuff$mean_gov
table_stuff$mean_gov4[is.na(table_stuff$mean_gov4)]<-999

table_stuff$mean_gov5 <- table_stuff$mean_gov
table_stuff$mean_gov5[is.na(table_stuff$mean_gov5)]<-999

table_stuff$mean_gov6 <- table_stuff$mean_gov
table_stuff$mean_gov6[is.na(table_stuff$mean_gov6)]<-999

table_stuff$mean_gov7 <- table_stuff$mean_gov
table_stuff$mean_gov7[is.na(table_stuff$mean_gov7)]<-999

table_stuff$mean_gov8 <- table_stuff$mean_gov
table_stuff$mean_gov8[is.na(table_stuff$mean_gov8)]<-999

table_stuff$mean_gov9 <- table_stuff$mean_gov
table_stuff$mean_gov9[is.na(table_stuff$mean_gov9)]<-999

table_stuff$physviol2 <- table_stuff$physviol
table_stuff$physviol2[is.na(table_stuff$physviol2)] <- 999

table_stuff$terror2 <- round(table_stuff$terror)
table_stuff$terror2[is.nan(table_stuff$terror2)] <- 999

table_stuff$discuss2 <- round(table_stuff$discuss*4)
table_stuff$discuss2[is.nan(table_stuff$discuss2)] <- 999



table(table_stuff$physviol)
table_stuff$mean_gov2[table_stuff$physviol2<=0.5 & table_stuff$physviol2>0.4] <- table_stuff$mean_gov2[table_stuff$physviol2<=0.5 & table_stuff$physviol2>0.4]-5
table_stuff$mean_gov2[table_stuff$physviol2<=0.4 & table_stuff$physviol2>0.3] <- table_stuff$mean_gov2[table_stuff$physviol2<=0.4 & table_stuff$physviol2>0.3]-10
table_stuff$mean_gov2[table_stuff$physviol2<=0.3 & table_stuff$physviol2>0.2] <- table_stuff$mean_gov2[table_stuff$physviol2<=0.3 & table_stuff$physviol2>0.2]-15
table_stuff$mean_gov2[table_stuff$physviol2<=0.2 & table_stuff$physviol2>0.1] <- table_stuff$mean_gov2[table_stuff$physviol2<=0.2 & table_stuff$physviol2>0.1]-20
table_stuff$mean_gov2[table_stuff$physviol2<=0.1 & table_stuff$physviol2>=0]  <- table_stuff$mean_gov2[table_stuff$physviol2<=0.1 & table_stuff$physviol2>=0]  -25

table_stuff$mean_gov2[table_stuff$mean_gov2>100] <- NA
table(table_stuff$mean_gov2)

table_stuff$mean_gov3[table_stuff$physviol2<=0.5 & table_stuff$physviol2>0.4] <- table_stuff$mean_gov3[table_stuff$physviol2<=0.5 & table_stuff$physviol2>0.4]-8
table_stuff$mean_gov3[table_stuff$physviol2<=0.4 & table_stuff$physviol2>0.3] <- table_stuff$mean_gov3[table_stuff$physviol2<=0.4 & table_stuff$physviol2>0.3]-16
table_stuff$mean_gov3[table_stuff$physviol2<=0.3 & table_stuff$physviol2>0.2] <- table_stuff$mean_gov3[table_stuff$physviol2<=0.3 & table_stuff$physviol2>0.2]-24
table_stuff$mean_gov3[table_stuff$physviol2<=0.2 & table_stuff$physviol2>0.1] <- table_stuff$mean_gov3[table_stuff$physviol2<=0.2 & table_stuff$physviol2>0.1] -32
table_stuff$mean_gov3[table_stuff$physviol2<=0.1 & table_stuff$physviol2>=0] <-  table_stuff$mean_gov3[table_stuff$physviol2<=0.1 & table_stuff$physviol2>=0]  -30

table_stuff$mean_gov3[table_stuff$mean_gov3>100] <- NA
table(table_stuff$mean_gov3)

table_stuff$mean_gov4[table_stuff$terror2==5] <- table_stuff$mean_gov4[table_stuff$terror2==5]-5
table_stuff$mean_gov4[table_stuff$terror2==4] <- table_stuff$mean_gov4[table_stuff$terror2==4]-10
table_stuff$mean_gov4[table_stuff$terror2==3] <- table_stuff$mean_gov4[table_stuff$terror2==3]-15

table_stuff$mean_gov4[table_stuff$mean_gov4>100] <- NA
table(table_stuff$mean_gov4)

table_stuff$mean_gov5[table_stuff$terror2==5] <- table_stuff$mean_gov5[table_stuff$terror2==5]-8
table_stuff$mean_gov5[table_stuff$terror2==4] <- table_stuff$mean_gov5[table_stuff$terror2==4]-16
table_stuff$mean_gov5[table_stuff$terror2==3] <- table_stuff$mean_gov5[table_stuff$terror2==3]-24

table_stuff$mean_gov5[table_stuff$mean_gov5>100] <- NA
table(table_stuff$mean_gov5)

table_stuff$mean_gov6[table_stuff$discuss2==2] <- table_stuff$mean_gov6[table_stuff$discuss2==2] -5
table_stuff$mean_gov6[table_stuff$discuss2==1] <- table_stuff$mean_gov6[table_stuff$discuss2==1] -10

table_stuff$mean_gov6[table_stuff$mean_gov6>100] <- NA
table(table_stuff$mean_gov6)

table_stuff$mean_gov7[table_stuff$discuss2==2] <- table_stuff$mean_gov7[table_stuff$discuss2==2] -10
table_stuff$mean_gov7[table_stuff$discuss2==1] <- table_stuff$mean_gov7[table_stuff$discuss2==1] -20

table_stuff$mean_gov7[table_stuff$mean_gov7>100] <- NA
table(table_stuff$mean_gov7)


load(qog_url)

qog10 <- subset(qog,qog$year==2000 |
                  qog$year==2001 |  
                  qog$year==2002 | 
                  qog$year==2003 | 
                  qog$year==2004 | 
                  qog$year==2005 | 
                  qog$year==2006 | 
                  qog$year==2007 | 
                  qog$year==2008 | 
                  qog$year==2009 |
                  qog$year==2010)

library(countrycode)
qog10$cntry<-countrycode(qog10$ccodecow, "cown","country.name")
qog10$al_ethnic<-as.numeric(qog10$al_ethnic)
#tidyr::gather(qog10,c("cntry","year"),"al_ethnic")

qog10a <- qog10 %>% dplyr::select(cntry,year,al_ethnic) %>%
  as.data.frame()
data_wide17 <- reshape(data = qog10a,
                       idvar = "cntry",
                       v.names = "al_ethnic",
                       timevar = "year",
                       direction = "wide")

#qog10hdi <- qog10 %>% dplyr::select(cntry,year,undp_hdi) %>%
#  as.data.frame()
#data_wide_hdi <- hdi
  #reshape(data = qog10hdi,
                      # idvar = "cntry",
                      # v.names = "undp_hdi",
                      # timevar = "year",
                      # direction = "wide")



table(qog$al_ethnic,qog$year)

qog14 <- subset(qog,qog$year==2014)
qog14$cntry<-countrycode(qog14$ccodecow, "cown","country.name")
qog14 <- qog14 %>% dplyr::select(cntry,year,cspf_legit) %>%
  as.data.frame()
data_wide18 <- reshape(data = qog14,
                       idvar = "cntry",
                       v.names = "cspf_legit",
                       timevar = "year",
                       direction = "wide")

qog15 <- subset(qog,qog$year==2015)
qog15$cntry<-countrycode(qog15$ccodecow, "cown","country.name")
qog15 <- qog15 %>% dplyr::select(cntry,year,ffp_sl) %>%
  as.data.frame()
data_wide19 <- reshape(data = qog15,
                       idvar = "cntry",
                       v.names = "ffp_sl",
                       timevar = "year",
                       direction = "wide")


qog10$ciri_physint<-as.numeric(qog10$ciri_physint)
qog10a <- qog10 %>% dplyr::select(cntry,year,ciri_physint) %>%
  as.data.frame()
data_wide20 <- reshape(data = qog10a,
                       idvar = "cntry",
                       v.names = "ciri_physint",
                       timevar = "year",
                       direction = "wide")

qog10$gd_ptss <-as.numeric(qog10$gd_ptss)
qog10a <- qog10 %>% dplyr::select(cntry,year,gd_ptss) %>%
  as.data.frame()
data_wide21 <- reshape(data = qog10a,
                       idvar = "cntry",
                       v.names = "gd_ptss",
                       timevar = "year",
                       direction = "wide")

qog14<-subset(qog,qog$year==2014)
qog13<-subset(qog,qog$year==2013)
qog12<-subset(qog,qog$year==2012)
qog11<-subset(qog,qog$year==2011)
qog10<-subset(qog,qog$year==2010)
qog8<-subset(qog,qog$year==2008)
qog7<-subset(qog,qog$year==2007)
qog6<-subset(qog,qog$year==2006)
qog5<-subset(qog,qog$year==2005)
qog4<-subset(qog,qog$year==2004)
qog3<-subset(qog,qog$year==2003)
qog2<-subset(qog,qog$year==2002)
qog1<-subset(qog,qog$year==2001)
qog0<-subset(qog,qog$year==2000)



table(is.na(qog$wel_culture),qog$year)
culreg<- pmax(qog14$wel_culture, qog13$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog12$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog11$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog10$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog8$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog7$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog6$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog5$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog4$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog3$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog2$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog1$wel_culture, na.rm = TRUE)
culreg<- pmax(culreg, qog0$wel_culture, na.rm = TRUE)
culreg<- as.character(sjmisc::to_label(culreg))
culreg<-as.data.frame(cbind(culreg,qog14$ccodecow))
oreast  <- subset(culreg, culreg$culreg == "Orthodox East")
oreast

#culreg<- pmax(culreg, qog10$wel_culture, na.rm = TRUE)

qog14$ht_region 

culreg$cntry<-countrycode(culreg$V2, "cown","country.name")
tabeletto<-merge(table_stuff,culreg,by="cntry")
tabeletto<-as.data.frame(cbind(table_stuff$regions,
                               as.character(table_stuff$cntry),
                               as.character(tabeletto$culreg)))
tabeletto <- tabeletto[order(tabeletto$V1, tabeletto$V3),]
#edit(tabeletto)

culreg<-data.frame(cbind(tabeletto,culreg))
culreg<-culreg[,c(2,4)]
names(culreg)[1]<-c("cntry")

table_stuff3 <- merge(table_stuff,culreg,by="cntry")

table(as.character(tabeletto$V3))

qog100 <- subset(qog,qog$year==2010)
qog100$cntry<-countrycode(sjmisc::to_label(qog100$ccodecow), "cown","country.name")
qog100 <- qog100 %>% dplyr::select(cntry,year,ht_regtype1) %>%
  as.data.frame()
qog100$regtype<-sjmisc::to_label(qog100$ht_regtype1)
qog100$year <- NULL
qog100$ht_regtype1 <- NULL
table(qog100$regtype)


ethnic10<-as.numeric(rowMeans(data_wide17[,2:12])) # mean over last 10 years (2000 - 2010)
physint10<-as.numeric(rowMeans(data_wide20[,2:12])) # mean over last 10 years (2000 - 2010)
terror10<-as.numeric(rowMeans(data_wide21[,2:12])) # mean over last 10 years (2000 - 2010)
legit<-as.numeric(data_wide18[,2]) # mean over last 10 years (2000 - 2010)
legit2<-as.numeric(data_wide19[,2]) # mean over last 10 years (2000 - 2010)
qogthingy<-data.frame(data_wide19[,1],ethnic10,legit,legit2,physint10,terror10)
colnames(qogthingy)[1]<-c("cntry")
qogthingy<-merge(x=qogthingy, y=qog100, by="cntry")

#qogthingy<-data.frame(data_wide17[,1],ethnic10)
#colnames(qogthingy)[1]<-c("cntry")
#combined <- merge(x=qogthingy, y=combined, by="cntry")


qog_cs <-read_spss("C:/Users/Favone/Downloads/qog_std_cs_jan17.sav") #loading dataset
qog_cs$cntry<-countrycode(qog_cs$ccodecow, "cown","country.name")
qog_cs$legit3<-as.numeric(qog_cs$gov_ixlegitimacyindex)

legit_dat<-data.frame(qog_cs$cntry,qog_cs$legit3)
colnames(legit_dat)<-c("cntry","legit3")

aggrdelib <- merge(x=legit_dat, y=aggrdelib, by="cntry")

aggrdelib$legit3 <- range01(aggrdelib$legit3)
cor(na.omit(aggrdelib[,c(4,5,7,13)]))
cor(na.omit(aggrdelib[,c(4,5,2,6:13)]))

aggrdelib$legit <- 1-range01(aggrdelib$legit)
aggrdelib$legit2 <- 1-range01(aggrdelib$legit2)
aggrdelib$asia <- aggrdelib$e.asia + aggrdelib$s.e.asia + aggrdelib$s.asia + aggrdelib$pacific

SFI <-read_spss("C:/Users/Favone/Downloads/SFIv2016.sav") #loading dataset
SFI <- subset(SFI,SFI$year==2015)
SFI$cntry <-countrycode(SFI$country, "country.name","country.name") 
SFI$cntry[79] <- "North Korea"
SFI$cntry <-countrycode(SFI$cntry, "country.name","country.name") 
SFI$legitimacy <- SFI$legit
SFI$legit <- NULL


aggrdelib <- merge(x=SFI, y=aggrdelib, by="cntry")

hdi <- read_csv("hdi.csv")
hdi$cntry<-countrycode(hdi$Country, "country.name","country.name")
hdi$'1990'<- NULL ; hdi$'1991'<- NULL ; hdi$'1992'<- NULL ; hdi$'1993'<- NULL
hdi$'1994'<- NULL; hdi$'1995'<- NULL; hdi$'1996'<- NULL; hdi$'1997'<- NULL
hdi$'1998'<- NULL ; hdi$'1999'<- NULL ; hdi$'2011'<- NULL ; hdi$'2012'<- NULL
hdi$'2013'<- NULL; hdi$'2014'<- NULL; hdi$'2015'<- NULL;hdi$`HDI Rank (2015)`<- NULL
hdi$Country<- NULL
hdi10<-as.numeric(rowMeans(hdi[,1:11])) 
hdat<-data.frame(hdi$cntry,hdi10) 
names(hdat)<-c("cntry","hdi10")

aggrdelib <- merge(x=hdat, y=aggrdelib, by="cntry")
#table(aggrdelib$hdi10)
#gc()
#combined <- merge(x=hdat, y=combined, by="cntry")


#colnames(aggrdelib)[9]<-"e_p_polity"
#lop<-subset(vdems_start,vdems_start$year==2010)

cor(na.omit(aggrdelib2[,2:17]))
cor(na.omit(data.frame(aggrdelib$polity10,aggrdelib$delib10)))

#hist(vdems$v2dlconslt)
#hist(vdems$v2xcl_disc)
#table(vdems_start$e_boix_regime,vdems_start$year)
#table(vdems_sub$e_p_polity,vdems_sub$year)

##### merging time ####

combined <- merge(x=merged, y=aggrdelib, by="cntry")
table(combined$cntry)

combined <- as.data.frame(combined)
combined$gov_trust <- as.numeric(combined$gov_trust)
combined$age <- as.numeric(combined$age)
combined$income <- as.numeric(combined$income)
combined$educ <- as.numeric(combined$educ)
combined$sex <- as.factor(combined$sex)
combined$authoritarian <- as.numeric(combined$authoritarian)
combined$safety <- as.numeric(combined$safety)
# combined$demtoday <- as.numeric(combined$demtoday)
combined$latino <- factor(combined$latino)
combined$afro <- factor(combined$afro)
combined$americas <- factor(combined$americas)
combined$asia <- combined$e.asia + combined$s.e.asia + combined$s.asia + combined$pacific

cor(na.omit(data.frame(combined$gov_trust,combined$income,combined$educ, #Socioeconomic factors
                       combined$delib10, combined$polity10, combined$gdp10)))

combined$cntry<-as.factor(combined$cntry)


#combined$polity10 <- combined$polity10*20-10

#combined$regime <- combined$polity10
#combined$regime[combined$polity_autodummy==1] <- "auto"
#combined$regime[combined$polity_anodummy==1] <- "ano"
#combined$regime[combined$polity_demdummy==1] <- "demo"

hist(combined$gov_trust)
qplot(combined$gov_trust)

combined$cntry



#physi_s <- vdems_sub2 %>% dplyr::select(cntryears, franz)

#combined <- merge(combined, physi_s, by = "cntryears")

#physi2_s <- ddply(combined,~cntry,
#                summarise,politcat=mean(franz,na.rm=T))

#combined <- merge(combined, physi2_s, by = "cntry")


vdems_sub2$cntryears <- paste(vdems_sub2$cntry,vdems_sub2$year)

physi <- vdems_sub2 %>% dplyr::select(cntryears, perc)

combined <- merge(combined, physi, by = "cntryears")

physi2 <- ddply(combined,~cntry,
                     summarise,physviol=mean(perc,na.rm=T))

combined <- merge(combined, physi2, by = "cntry")





#physi_22$dis3 <-round(physi_22$dis2)

#unique(physi2_s$cntry)

#1-2.5
#3-5
#5.5 - 7
#physi2_s$politcat2<-8-((physi2_s$politcat) * (7/10))
#11 

#physi2_s$polity_demdummy <- physi2_s$politcat2
#physi2_s$polity_demdummy [physi2_s$politcat2 <= 2.5] <- 1
#physi2_s$polity_demdummy [physi2_s$politcat2 >  2.5] <- 0
#table(physi2_s$polity_demdummy)

#physi2_s$polity_anodummy <- physi2_s$politcat2
#physi2_s$polity_anodummy[physi2_s$politcat2 > 2.5 & physi2_s$politcat2 < 5.5] <- 1
#physi2_s$polity_anodummy[physi2_s$politcat2 <= 2.5 | physi2_s$politcat2 >= 5.5] <- 0
#table(physi2_s$polity_anodummy)

#physi2_s$polity_autodummy <- physi2_s$politcat2
#physi2_s$polity_autodummy[physi2_s$politcat2 >= 5.5] <- 1
#physi2_s$polity_autodummy[physi2_s$politcat2 < 5.5] <- 0
#table(physi2_s$polity_autodummy)

#physi2_s$regime <- physi2_s$politcat
#physi2_s$regime[physi2_s$polity_autodummy==1] <- "auto"
#physi2_s$regime[physi2_s$polity_anodummy==1] <- "ano"
#physi2_s$regime[physi2_s$polity_demdummy==1] <- "demo"

#unique(physi2_s$cntry)

table(physi2_s$regime)

qog2000 <- subset(qog,qog$year==2010 |
                       qog$year==2011 |  
                       qog$year==2012 | 
                       qog$year==2013 | 
                       qog$year==2014 | 
                       qog$year==2015)

table(qog2000$gd_ptsa,qog2000$year)

qog2000$perc2 <- qog2000$gd_ptsa

qog2000$cntry<-countrycode(qog2000$ccodecow, "cown","country.name")

qog2000$cntryears <- paste(qog2000$cntry,qog2000$year)

physi2000 <- qog2000 %>% dplyr::select(cntryears, perc2)

combined <- merge(combined, physi2000, by = "cntryears")

physi22000 <- ddply(combined,~cntry,
                summarise,terror=mean(perc2,na.rm=T))

combined <- merge(combined, physi22000, by = "cntry")

#table(qog2000$undp_hdi,qog2000$year)

#physiff <- qog2000 %>% dplyr::select(cntryears, undp_hdi)

#combined <- merge(combined, physiff, by = "cntryears")

#physiff2 <- ddply(combined,~cntry,
#                    summarise,hdi=mean(undp_hdi,na.rm=T))

#combined <- merge(combined, physiff2, by = "cntry")


gni <- read_csv("GNI.csv",  skip = 1)

gni$`2015`<-gsub("ttt","",gni$`2015`)
gni$`2015`<-gsub("ff","",gni$`2015`)
gni$`2015`<-gsub("sss","",gni$`2015`)
gni$`2015`<-gsub("uuu","",gni$`2015`)
gni$`2015`<-gsub("o","",gni$`2015`)
gni$`2015` <- as.numeric(gni$`2015`)

gni$`2014`<-gsub("ttt","",gni$`2014`)
gni$`2014`<-gsub("ff","",gni$`2014`)
gni$`2014`<-gsub("sss","",gni$`2014`)
gni$`2014`<-gsub("uuu","",gni$`2014`)
gni$`2014`<-gsub("o","",gni$`2014`)
gni$`2014` <- as.numeric(gni$`2014`)

gni<-gni[,c(2,23:28)]

gni<-gather(as.data.frame(gni),key = "Country")
names(gni) <- c("cntry","year","gni")

gni$cntry<-countrycode(gni$cntry,"country.name","country.name")
gni$cntryears <- paste(gni$cntry,gni$year)

physigni <- gni %>% dplyr::select(cntryears, gni)

combined <- merge(combined, physigni, by = "cntryears")

physigni2 <- ddply(combined,~cntry,
                    summarise,gni_c=mean(gni,na.rm=T))

combined <- merge(combined, physigni2, by = "cntry")

To Do - Regions

  mutate(regions = vdems_sub %>% 
           dcast(country_name ~ year, 
                 value.var=c("e_regionpol")) %>%
           select('2000') %>% 
           mutate(regions = fct_recode(as.factor(`2000`),
                                "E. Europe and C. Asia (post-Communist)" = "1",
                                "Latin America & Carribean" = "2",
                                "MENA" = "3",
                                "Sub-Saharan Africa" = "4",
                                "W. Europe and N. America" = "5",
                                "South & East Asia & Pacific" = "6",
                                "South & East Asia & Pacific" = "7",
                                "South & East Asia & Pacific" = "8",
                                "South & East Asia & Pacific" = "9",
                                "Latin America & Carribean" = "10")  %>%
                                as_factor))  %>%
           select(regions)


table(regions)

regions2 <- vdems_sub %>% 
  dcast(country_name ~ year, 
        value.var=c("e_regionpol")) %>%
  select('2000') %>% 
  transmute(fct_recode(as.factor(`2000`),
                       "E. Europe and C. Asia (post-Communist)" = "1",
                       "Latin America & Carribean" = "2",
                       "MENA" = "3",
                       "Sub-Saharan Africa" = "4",
                       "W. Europe and N. America" = "5",
                       "East Asia" = "6",
                       "South-East Asia" = "7",
                       "South Asia" = "8",
                       "Pacific" = "9",
                       "Latin America & Carribean" = "10"))

table(regions2)

regions3 <- dcast(vdems_sub, country_name ~ year, value.var=c("e_regionpol"))$"2000"

postcom   <- as.numeric(regions3 == 1)
latin     <- as.numeric(regions3 == 2 | regions3 == 10)
mena      <- as.numeric(regions3 == 3)
subsahara <- as.numeric(regions3 == 4)
west      <- as.numeric(regions3 == 5)
e.asia    <- as.numeric(regions3 == 6)
s.e.asia  <- as.numeric(regions3 == 7)
s.asia    <- as.numeric(regions3 == 8)
pacific   <- as.numeric(regions3 == 9)


ww <- vdems_sub %>% 
  dcast(country_name ~ year, 
                 value.var=c("e_regionpol")) %>%
  select('2000') %>% 
  mutate(regions = fct_recode(as.factor(`2000`),
                                "E. Europe and C. Asia (post-Communist)" = "1",
                                "Latin America & Carribean" = "2",
                                "MENA" = "3",
                                "Sub-Saharan Africa" = "4",
                                "W. Europe and N. America" = "5",
                                "South & East Asia & Pacific" = "6",
                                "South & East Asia & Pacific" = "7",
                                "South & East Asia & Pacific" = "8",
                                "South & East Asia & Pacific" = "9",
                                "Latin America & Carribean" = "10")) %>%
                                 as_factor() %>%
                                 select(regions)

ww

regions2 <- vdems_sub %>% 
  dcast(country_name ~ year, 
        value.var=c("e_regionpol")) %>%
  select('2000') %>% 
  transmute(fct_recode(as.factor(`2000`),
                       "E. Europe and C. Asia (post-Communist)" = "1",
                       "Latin America & Carribean" = "2",
                       "MENA" = "3",
                       "Sub-Saharan Africa" = "4",
                       "W. Europe and N. America" = "5",
                       "East Asia" = "6",
                       "South-East Asia" = "7",
                       "South Asia" = "8",
                       "Pacific" = "9",
                       "Latin America & Carribean" = "10"))

table(regions2)

regions3 <- dcast(vdems_sub, country_name ~ year, value.var=c("e_regionpol"))$"2000"

postcom   <- as.numeric(regions3 == 1)
latin     <- as.numeric(regions3 == 2 | regions3 == 10)
mena      <- as.numeric(regions3 == 3)
subsahara <- as.numeric(regions3 == 4)
west      <- as.numeric(regions3 == 5)
e.asia    <- as.numeric(regions3 == 6)
s.e.asia  <- as.numeric(regions3 == 7)
s.asia    <- as.numeric(regions3 == 8)
pacific   <- as.numeric(regions3 == 9)
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIExvYWRpbmcgdGhlIFBhY2thZ2VzDQoNCmBgYHtyfQ0KbGlicmFyeShwYWNtYW4pDQoNCiNwX2luc3RhbGxfZ2goImZhdnN0YXRzL2ZhdnN0YXRzIikNCnBfbG9hZCh0aWR5dmVyc2UsIGhhdmVuLHNqbWlzYywNCiAgICAgICAgICAgICAgICAgICAgIGZvcmNhdHMsIHdlaWdodHMsIGNhciwNCiAgICAgICAgICAgICAgICAgICAgIGNvdW50cnljb2RlLCBsYXZhYW4sDQogICAgICAgICAgICAgICAgICAgICBzZW1Ub29scywgbGF2YWFuLnN1cnZleSwNCiAgICAgICAgICAgICAgICAgICAgIHN1cnZleSwgcmVzaGFwZTIsIGZhdnN0YXRzLA0KICAgICAgICAgICAgICAgICAgICAgbWFncml0dHIsIHNraW1yLCB4cmF5KQ0KDQpyYW5nZTAxIDwtIGZ1bmN0aW9uKHgpeyh4LW1pbih4LCBuYS5ybSA9IFQpKS8obWF4KHgsIG5hLnJtID0gVCktbWluKHgsIG5hLnJtID0gVCkpfQ0KYGBgDQoNCiMgTG9hZGluZyB0aGUgVVJMcw0KDQpgYGB7cn0NCmFmcm81X3VybCA8LSB1cmwoImh0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci9hZnJvNS5SRGF0YSIpDQphZnJvNl91cmwgPC0gdXJsKCJodHRwczovL2dpdGh1Yi5jb20vZmF2c3RhdHMvZGF0YWJhc2VfZGVsaWIvcmF3Ly9tYXN0ZXIvYWZybzYuUkRhdGEiKQ0KDQpsYXRpbm8yMDEzX3VybCA8LSB1cmwoImh0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci9sYXRpbm8yMDEzLlJEYXRhIikNCmxhdGlubzIwMTVfdXJsIDwtIHVybCgiaHR0cHM6Ly9naXRodWIuY29tL2ZhdnN0YXRzL2RhdGFiYXNlX2RlbGliL3Jhdy8vbWFzdGVyL2xhdGlubzIwMTUuUkRhdGEiKQ0KDQp3dnNfcmF3X3VybCA8LSB1cmwoImh0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci93dnNfcmF3LlJEYXRhIikNCg0KYW1lcmljYXNfdXJsIDwtIHVybCgiaHR0cHM6Ly9naXRodWIuY29tL2ZhdnN0YXRzL2RhdGFiYXNlX2RlbGliL3Jhdy8vbWFzdGVyL2FtZXJpY2FzLlJEYXRhIikNCmJvbGl2aWFfdXJsIDwtIHVybCgiaHR0cHM6Ly9naXRodWIuY29tL2ZhdnN0YXRzL2RhdGFiYXNlX2RlbGliL3Jhdy8vbWFzdGVyL2JvbGl2aWEuUkRhdGEiKQ0KY2FuYWRhX3VybCA8LSB1cmwoImh0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci9jYW5hZGEuUkRhdGEiKQ0KDQphc2lhbl9yYXdfdXJsIDwtIHVybCgiaHR0cHM6Ly9naXRodWIuY29tL2ZhdnN0YXRzL2RhdGFiYXNlX2RlbGliL3Jhdy8vbWFzdGVyL2FzaWFuX3Jhdy5SRGF0YSIpDQpteWFubWFyX3Jhd191cmwgPC0gdXJsKCJodHRwczovL2dpdGh1Yi5jb20vZmF2c3RhdHMvZGF0YWJhc2VfZGVsaWIvcmF3Ly9tYXN0ZXIvbXlhbm1hcl9yYXcuUkRhdGEiKQ0KbW9uZ29saWFfcmF3X3VybCA8LSB1cmwoImh0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci9tb25nb2xpYV9yYXcuUkRhdGEiKQ0KcGhpbGlwX3Jhd191cmwgPC0gdXJsKCJodHRwczovL2dpdGh1Yi5jb20vZmF2c3RhdHMvZGF0YWJhc2VfZGVsaWIvcmF3Ly9tYXN0ZXIvcGhpbGlwX3Jhdy5SRGF0YSIpDQp0YWl3YW5fcmF3X3VybCA8LSB1cmwoImh0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci90YWl3YW5fcmF3LlJEYXRhIikNCnRoYWlfcmF3X3VybCA8LSB1cmwoImh0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci90aGFpX3Jhdy5SRGF0YSIpDQptYWxheV9yYXdfdXJsIDwtIHVybCgiaHR0cHM6Ly9naXRodWIuY29tL2ZhdnN0YXRzL2RhdGFiYXNlX2RlbGliL3Jhdy8vbWFzdGVyL21hbGF5X3Jhdy5SRGF0YSIpDQpzaW5nYXBvcmVfcmF3X3VybCA8LSB1cmwoImh0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci9zaW5nYXBvcmVfcmF3LlJEYXRhIikNCnNrX3Jhd191cmwgPC0gdXJsKCJodHRwczovL2dpdGh1Yi5jb20vZmF2c3RhdHMvZGF0YWJhc2VfZGVsaWIvcmF3Ly9tYXN0ZXIvc2tfcmF3LlJEYXRhIikNCmNhbWJvZGlhX3Jhd191cmwgPC0gdXJsKCJodHRwczovL2dpdGh1Yi5jb20vZmF2c3RhdHMvZGF0YWJhc2VfZGVsaWIvcmF3Ly9tYXN0ZXIvY2FtYm9kaWFfcmF3LlJEYXRhIikNCg0KRVNTX3Jhd191cmwgPC0gdXJsKCJodHRwczovL2dpdGh1Yi5jb20vZmF2c3RhdHMvZGF0YWJhc2VfZGVsaWIvYmxvYi9tYXN0ZXIvRVNTX3Jhdy5SZGF0YT9yYXc9dHJ1ZSIpDQoNCnZkZW1zX3N0YXJ0X3VybCA8LSB1cmwoImh0dHBzOi8vZ2l0aHViLmNvbS9mYXZzdGF0cy9kYXRhYmFzZV9kZWxpYi9yYXcvL21hc3Rlci92ZGVtc19zdGFydC5SZGF0YSIpDQoNCnFvZ191cmwgPC0gdXJsKCJodHRwczovL2dpdGh1Yi5jb20vZmF2c3RhdHMvZGF0YWJhc2VfZGVsaWIvcmF3Ly9tYXN0ZXIvcW9nLlJkYXRhIikNCg0KYGBgDQoNCg0KIyBBZnJvYmFyb21ldGVyIERhdGENCg0KIyMgQWZybyA1DQoNCmBgYHtyfQ0KbG9hZChhZnJvNV91cmwpDQoNCmRlbGV0ZV9uYV9hZnJvIDwtIGZ1bmN0aW9uKHgpIHsNCiAgeCA8LSBSZWNvZGUoeCwgIjkgPSBOQTsNCiAgICAgICAgICAgIDk4ID0gTkE7DQogICAgICAgICAgICA5OSA9IE5BOw0KICAgICAgICAgICAgLTEgPSBOQSIpDQogIHJldHVybih4KQ0KfSAjIEZ1bmt0aW9uIHVtIGRpZSBOQXMgaW0gQWZybyBEYXRlbnNhdHogenUgYmVzdGltbWVuDQoNCiMgYWxsZSBWYXJpYWJsZW4NCmFmcm9fNSA8LSBhZnJvNSAlPiUNCiAgcmVuYW1lKA0KICAgIGVkdWMgPSBROTcsICMgVmFyaWFibGVuIHVtYmVuZW5uZW4NCiAgICBpbmNvbWUgPSBRM0IsDQogICAgc2V4ID0gUTEwMSwNCiAgICB3b3JrID0gUTk2LA0KICAgIHRydXN0X2dvdiA9IFE1OUEsDQogICAgdHJ1c3RfcGFybGlhbWVudCA9IFE1OUIsDQogICAgdHJ1c3RfcG9saWNlID0gUTU5SCwNCiAgICB0cnVzdF9jb3VydHMgPSBRNTlKLA0KICAgICMgZGVtdG9kYXkgPSBRNDZBDQogICkgJT4lDQogIG11dGF0ZV9hdCgNCiAgICB2YXJzKA0KICAgICAgaW5jb21lLCB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cywgd29yaw0KICAgICksDQogICAgZGVsZXRlX25hX2Fmcm8NCiAgKSAlPiUgIyBOQXMgZGVsZXRlbg0KICBtdXRhdGUoDQogICAgc2V4ID0gc2V4IC0gMSwgIyBzZXggKDAvMSkgY29kaWVyZW4NCiAgICB3b3JrID0gUmVjb2RlKA0KICAgICAgd29yaywgIyB3b3JrICgwLzEpIGNvZGllcmVuDQogICAgICAiMSA9IDA7DQogICAgICAgMiA9IDE7DQogICAgICAgMyA9IDEiDQogICAgKSwNCiAgICBhZ2UgPSBSZWNvZGUoDQogICAgICBRMSwgIyBtaXNzaW5nIHZhbHVlcyBsP3NjaGVuDQogICAgICAiLTEgPSBOQTsNCiAgICAgIDk5OCA9IE5BOw0KICAgICAgOTk5ID0gTkEiDQogICAgKSwNCiAgICAjIGRlbXRvZGF5ID0gUmVjb2RlKA0KICAgICMgICBkZW10b2RheSwNCiAgICAjICAgIi0xID0gTkE7DQogICAgIyAgICA5OCA9IE5BOw0KICAgICMgICAgOTkgPSBOQSINCiAgICAjICksDQogICAgZWR1YyA9IFJlY29kZSgNCiAgICAgIGVkdWMsDQogICAgICAiLTEgPSBOQTsNCiAgICAgICA5OCA9IE5BOw0KICAgICAgIDk5ID0gTkE7DQogICAgICA5OTkgPSBOQSINCiAgICApLA0KICAgIGNudHJ5ID0gdG9fbGFiZWwoQ09VTlRSWV9BTFBIQSksDQogICAgeWVhciA9IGFzLm51bWVyaWMoZm9ybWF0KERBVEVJTlRSLCAiJVkiKSkNCiAgKSAlPiUNCiAgc2VsZWN0KA0KICAgIGNudHJ5LCB5ZWFyLCBhZ2UsIHNleCwgaW5jb21lLCBlZHVjLCB3b3JrLCANCiAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzDQogICkNCg0KYWZyb181DQoNCnNhdmUoYWZyb181LCBmaWxlID0gImNvZGVib29rcy9zaW5nbGVzL2Fmcm9fNS5SZGF0YSIpDQoNCg0KDQoNCmBgYA0KDQojIyBBZnJvIDYNCg0KYGBge3J9DQpsb2FkKGFmcm82X3VybCkNCg0KYWZyb182IDwtIGFmcm82ICU+JQ0KICByZW5hbWUoDQogICAgZWR1YyA9IFE5NywNCiAgICBpbmNvbWUgPSBRNEIsDQogICAgc2V4ID0gUTEwMSwNCiAgICB3b3JrID0gUTk1LA0KICAgIHRydXN0X2dvdiA9IFE1MkEsDQogICAgdHJ1c3RfcGFybGlhbWVudCA9IFE1MkIsDQogICAgdHJ1c3RfcG9saWNlID0gUTUySCwNCiAgICB0cnVzdF9jb3VydHMgPSBRNTJKLA0KICAgICMgZGVtdG9kYXkgPSBRNDANCiAgKSAlPiUNCiAgbXV0YXRlX2F0KA0KICAgIHZhcnMoDQogICAgICBpbmNvbWUsIHRydXN0X2dvdiwNCiAgICAgIHRydXN0X3BhcmxpYW1lbnQsIHRydXN0X3BvbGljZSwNCiAgICAgIHRydXN0X2NvdXJ0cywgd29yaw0KICAgICksDQogICAgZGVsZXRlX25hX2Fmcm8NCiAgKSAlPiUgIyBOQXMgZGVsZXRlbg0KICBtdXRhdGUoDQogICAgc2V4ID0gc2V4IC0gMSwgIyBzZXggKDAvMSkgY29kaWVyZW4NCiAgICB3b3JrID0gUmVjb2RlKA0KICAgICAgd29yaywgIyB3b3JrICgwLzEpIGNvZGllcmVuDQogICAgICAiMSA9IDA7DQogICAgICAgMiA9IDE7DQogICAgICAgMyA9IDEiDQogICAgKSwNCiAgICBhZ2UgPSBSZWNvZGUoDQogICAgICBRMSwgIyBtaXNzaW5nIHZhbHVlcyBsP3NjaGVuDQogICAgICAiLTEgPSBOQTsNCiAgICAgIDk5OCA9IE5BOw0KICAgICAgOTk5ID0gTkEiDQogICAgKSwNCiAgICBlZHVjID0gUmVjb2RlKA0KICAgICAgZWR1YywNCiAgICAgICItMSA9IE5BOw0KICAgICAgIDk4ID0gTkE7DQogICAgICAgOTkgPSBOQTsNCiAgICAgIDk5OSA9IE5BIg0KICAgICksDQogICAgIyBkZW10b2RheSA9IFJlY29kZSgNCiAgICAjICAgZGVtdG9kYXksDQogICAgIyAgICI4ID0gTkEiDQogICAgIyApLA0KICAgIGNudHJ5ID0gdG9fbGFiZWwoQ09VTlRSWV9SNUxpc3QpLA0KICAgIHllYXIgPSBhcy5udW1lcmljKGZvcm1hdChEQVRFSU5UUiwgIiVZIikpDQogICkgJT4lDQogICMgIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgZWR1YywgYWdlLA0KICAjICAgICAgICAgICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICMgICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzKSwNCiAgIyAgICAgICAgICAgIGFzLmNoYXJhY3RlcikgJT4lDQogICMgIG11dGF0ZV9hdCh2YXJzKGluY29tZSwgZWR1YywgYWdlLA0KICAjICAgICAgICAgICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICMgICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzKSwNCiAgIyAgICAgICAgICAgIGFzLm51bWVyaWMpICU+JQ0KICBzZWxlY3QoDQogICAgY250cnksIHllYXIsIGFnZSwgc2V4LCBpbmNvbWUsDQogICAgZWR1Yywgd29yaywgI2RlbXRvZGF5LA0KICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cw0KICApIA0KDQphZnJvXzYNCg0Kc2F2ZShhZnJvXzYsIGZpbGUgPSAiY29kZWJvb2tzL3NpbmdsZXMvYWZyb182LlJkYXRhIikNCg0KDQpgYGANCg0KIyMgTWVyZ2luZyB0aGUgRGF0YQ0KDQpgYGB7cn0NCmFmcm9fcmVhbCA8LSBhZnJvXzUgJT4lIA0KICBtdXRhdGVfYXQoDQogICAgdmFycygNCiAgICAgIGluY29tZSwgZWR1YywNCiAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzDQogICAgKSwNCiAgICByYW5nZTAxDQogICkNCg0KYWZyb19yZWFsMiA8LSBhZnJvXzYgJT4lIA0KICBtdXRhdGVfYXQoDQogICAgdmFycygNCiAgICAgIGluY29tZSwgZWR1YywNCiAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzDQogICAgKSwNCiAgICByYW5nZTAxDQogICkNCiMgbGVuZ3RoKHVuaXF1ZShhZnJvX3JlYWwkY250cnkpKQ0KIyBsZW5ndGgodW5pcXVlKGFmcm9fcmVhbDIkY250cnkpKQ0KIyB0YWJsZShhZnJvX3JlYWwyJHllYXIpDQoNCmFmcm8gPC0gcmJpbmQoYWZyb19yZWFsLCBhZnJvX3JlYWwyKSAlPiUgYXMudGJsKCkNCg0KYWZybw0KYGBgDQoNCiMgTGF0aW5vIEJhcm9tZXRybw0KDQojIyBMYXRpbm8gMjAxMw0KDQpgYGB7cn0NCmxvYWQobGF0aW5vMjAxM191cmwpDQoNCmxhdGlub18yMDEzIDwtIGxhdGlubzIwMTMgJT4lDQogIHJlbmFtZSgNCiAgICBlZHVjID0gUkVFRFVDXzEsDQogICAgaW5jb21lID0gUzYsDQogICAgIyBkZW10b2RheSA9IFA1MFRHQi5BLA0KICAgIGFnZSA9IFMxMQ0KICApICU+JQ0KICBtdXRhdGUoDQogICAgc2V4ID0gUzEwIC0gMSwgIyBzZXggdmFyaWFibGUgZXJzdGVsbGVuDQogICAgY250cnkgPSB0b19sYWJlbChJREVOUEEpLCAjIGNudHJ5IHZhcmlhYmxlIGVyc3RlbGxlbg0KICAgIHRydXN0X2dvdiA9IDUgLSBQMjZUR0IuQiwNCiAgICB0cnVzdF9wYXJsaWFtZW50ID0gNSAtIFAyNlRHQi5DLA0KICAgIHRydXN0X3BvbGljZSA9IDUgLSBQMjhUR0IuQiwNCiAgICB0cnVzdF9jb3VydHMgPSA1IC0gUDI2VEdCLkUsDQogICAgeWVhciA9IDIwMTMsDQogICAgaW5jb21lID0gNSAtIGluY29tZSwNCiAgICB3b3JrID0gUmVjb2RlKA0KICAgICAgUzE5LkEsDQogICAgICAiMiA9IDE7DQogICAgICAgMyA9IDE7DQogICAgICAgNCA9IDA7DQogICAgICAgNSA9IDA7DQogICAgICAgNiA9IDA7DQogICAgICAgNyA9IDAiDQogICAgKQ0KICApICU+JQ0KICBzZWxlY3QoDQogICAgY250cnksIHllYXIsIGFnZSwgc2V4LCBpbmNvbWUsIGVkdWMsIHdvcmssIA0KICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCiAgKQ0KDQpsYXRpbm9fMjAxMw0KDQoNCnNhdmUobGF0aW5vXzIwMTMsIGZpbGUgPSAiY29kZWJvb2tzL3NpbmdsZXMvbGF0aW5vXzIwMTMuUmRhdGEiKQ0KDQpgYGANCg0KIyMgTGF0aW5vIDIwMTUNCg0KYGBge3J9DQpsb2FkKGxhdGlubzIwMTVfdXJsKQ0KDQpsYXRpbm9fMjAxNSA8LSBsYXRpbm8yMDE1ICU+JQ0KICBtdXRhdGUoc2V4ID0gUzEyIC0gMSkgJT4lICMgc2V4IHZhcmlhYmxlIGVyc3RlbGxlbg0KICByZW5hbWUoDQogICAgZWR1YyA9IFJFRURVQ18xLA0KICAgIGluY29tZSA9IFM0LA0KICAgICMgZGVtdG9kYXkgPSBQMTdTVEdCUywNCiAgICBhZ2UgPSBTMTMNCiAgKSAlPiUNCiAgbXV0YXRlKA0KICAgIHRydXN0X2dvdiA9IDUgLSBQMTZTVC5HLA0KICAgIHRydXN0X3BhcmxpYW1lbnQgPSA1IC0gUDE2U1QuRiwNCiAgICB0cnVzdF9wb2xpY2UgPSA1IC0gUDE2VEdCLkIsDQogICAgdHJ1c3RfY291cnRzID0gNSAtIFAxNlNULkgsDQogICAgd29yayA9IFJlY29kZSgNCiAgICAgIFMyMS5BLA0KICAgICAgIjIgPSAxOw0KICAgICAgIDMgPSAxOw0KICAgICAgIDQgPSAwOw0KICAgICAgIDUgPSAwOw0KICAgICAgIDYgPSAwOw0KICAgICAgIDcgPSAwIg0KICAgICksDQogICAgY250cnkgPSB0b19sYWJlbChJREVOUEEpLA0KICAgIGluY29tZSA9IDUgLSBpbmNvbWUsDQogICAgeWVhciA9IDIwMTUNCiAgKSAlPiUNCiAgc2VsZWN0KA0KICAgIGNudHJ5LCB5ZWFyLCBhZ2UsIHNleCwgaW5jb21lLCBlZHVjLCB3b3JrLCANCiAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzDQogICkNCg0KbGF0aW5vXzIwMTUNCg0Kc2F2ZShsYXRpbm9fMjAxNSwgZmlsZSA9ICJjb2RlYm9va3Mvc2luZ2xlcy9sYXRpbm9fMjAxNS5SZGF0YSIpDQpgYGANCg0KIyMgTWVyZ2luZyB0aGUgRGF0YQ0KDQpgYGB7cn0NCmxhdGlub19yZWFsIDwtIGxhdGlub18yMDEzICU+JSANCiAgbXV0YXRlX2F0KA0KICAgIHZhcnMoDQogICAgICBpbmNvbWUsIGVkdWMsDQogICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cw0KICAgICksDQogICAgcmFuZ2UwMQ0KICApDQoNCmxhdGlub19yZWFsMiA8LSBsYXRpbm9fMjAxNSAlPiUgDQogIG11dGF0ZV9hdCgNCiAgICB2YXJzKA0KICAgICAgaW5jb21lLCBlZHVjLA0KICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCiAgICApLA0KICAgIHJhbmdlMDENCiAgKQ0KDQpsYXRpbm8gPC0gcmJpbmQobGF0aW5vX3JlYWwsIGxhdGlub19yZWFsMikgJT4lIGFzLnRibCgpDQoNCmxhdGlubw0KDQpgYGANCg0KDQoNCiMgV29ybGQgVmFsdWUgU3VydmV5DQoNCmBgYHtyfQ0KbG9hZCh3dnNfcmF3X3VybCkNCg0Kd3ZzIDwtIHd2c19yYXcgJT4lDQogIHJlbmFtZSgNCiAgICBlZHVjID0gVjI0OCwNCiAgICBpbmNvbWUgPSBWMjM5LA0KICAgICMgZGVtdG9kYXkgPSBWMTQxLA0KICAgIGFnZSA9IFYyNDIsDQogICAgeWVhciA9IFYyNjINCiAgKSAlPiUNCiAgbXV0YXRlKA0KICAgIHNleCA9IFYyNDAgLSAxLCAjIHNleCB2YXJpYWJsZSBlcnN0ZWxsZW4NCiAgICB0cnVzdF9nb3YgPSA1IC0gVjExNSwNCiAgICB0cnVzdF9wYXJsaWFtZW50ID0gNSAtIFYxMTcsDQogICAgdHJ1c3RfcG9saWNlID0gNSAtIFYxMTMsDQogICAgdHJ1c3RfY291cnRzID0gNSAtIFYxMTQsDQogICAgd29yayA9IFJlY29kZSgNCiAgICAgIFYyMjksDQogICAgICAiMiA9IDE7DQogICAgICAgMyA9IDE7DQogICAgICAgNCA9IDA7DQogICAgICAgNSA9IDA7DQogICAgICAgNiA9IDA7DQogICAgICAgNyA9IDA7DQogICAgICAgOCA9IDAiDQogICAgKSwNCiAgICBjbnRyeSA9IHRvX2xhYmVsKFYyKQ0KICApICU+JQ0KICBzZWxlY3QoDQogICAgY250cnksIHllYXIsIGFnZSwgc2V4LCBpbmNvbWUsIGVkdWMsIHdvcmssIA0KICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cw0KICApDQoNCg0KDQp3dnMNCg0Kc2F2ZSh3dnMsIGZpbGUgPSAiY29kZWJvb2tzL3NpbmdsZXMvd3ZzLlJkYXRhIikNCmBgYA0KDQojIEFtZXJpY2FzIEJhcm9tZXRlcg0KDQojIyBBbWVyaWNhcyBNYWluDQoNCmBgYHtyfQ0KbG9hZChhbWVyaWNhc191cmwpDQoNCmFtZXJpY2FzXyA8LSBhbWVyaWNhcyAlPiUNCiAgbXV0YXRlKGNudHJ5ID0gdG9fbGFiZWwocGFpcykpICU+JQ0KICBzZWxlY3QoDQogICAgY250cnksIG9jdXA0YSwgZWQsIHExMG5ldywgcTEsIHEyLA0KICAgIGIxMGEsIGIxMywgYjE4LCBiMjFhLCBuMywgeWVhcg0KICApICU+JQ0KICByZW5hbWUoDQogICAgd29yayA9IG9jdXA0YSwNCiAgICBlZHVjID0gZWQsDQogICAgaW5jb21lID0gcTEwbmV3LA0KICAgIHNleCA9IHExLA0KICAgIGFnZSA9IHEyLA0KICAgIHRydXN0X2NvdXJ0cyA9IGIxMGEsDQogICAgdHJ1c3RfcGFybGlhbWVudCA9IGIxMywNCiAgICB0cnVzdF9wb2xpY2UgPSBiMTgsDQogICAgdHJ1c3RfZ292ID0gYjIxYSwNCiAgICAjIGRlbXRvZGF5ID0gbjMNCiAgKSAlPiUNCiAgbXV0YXRlKA0KICAgIHNleCA9IHNleCAtIDEsICMgc2V4IHZhcmlhYmxlIGVyc3RlbGxlbg0KICAgIHdvcmsgPSBSZWNvZGUoDQogICAgICB3b3JrLA0KICAgICAgIjIgPSAxOw0KICAgICAgIDMgPSAxOw0KICAgICAgIDQgPSAwOw0KICAgICAgIDUgPSAwOw0KICAgICAgIDYgPSAwOw0KICAgICAgIDcgPSAwIg0KICAgICkNCiAgKSAlPiUNCiAgc2VsZWN0KA0KICAgIGNudHJ5LCB5ZWFyLCBhZ2UsIHNleCwgaW5jb21lLCBlZHVjLCB3b3JrLCAgDQogICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cw0KICApDQoNCmFtZXJpY2FzXw0KDQoNCnNhdmUoYW1lcmljYXNfLCBmaWxlID0gImNvZGVib29rcy9zaW5nbGVzL2FtZXJpY2FzXy5SZGF0YSIpDQpgYGANCg0KDQojIyBCb2xpdmlhDQoNCmBgYHtyfQ0KbG9hZChib2xpdmlhX3VybCkNCg0KYm9saXZpYV8gPC0gYm9saXZpYSAlPiUNCiAgbXV0YXRlKGNudHJ5ID0gdG9fbGFiZWwocGFpcykpICU+JQ0KICBzZWxlY3QoDQogICAgY250cnksIG9jdXA0YSwgZWQsIHExMG5ldywgcTEsIHEyLA0KICAgIGIxMGEsIGIxMywgYjE4LCBiMjFhLCBuMywgeWVhcg0KICApICU+JQ0KICByZW5hbWUoDQogICAgd29yayA9IG9jdXA0YSwNCiAgICBlZHVjID0gZWQsDQogICAgaW5jb21lID0gcTEwbmV3LA0KICAgIHNleCA9IHExLA0KICAgIGFnZSA9IHEyLA0KICAgIHRydXN0X2NvdXJ0cyA9IGIxMGEsDQogICAgdHJ1c3RfcGFybGlhbWVudCA9IGIxMywNCiAgICB0cnVzdF9wb2xpY2UgPSBiMTgsDQogICAgdHJ1c3RfZ292ID0gYjIxYSwgIyB2aWVsZSBtaXNzaW5nIHZhbHVlcw0KICAgICMgZGVtdG9kYXkgPSBuMw0KICApICU+JQ0KICBtdXRhdGUoDQogICAgc2V4ID0gc2V4IC0gMSwgIyBzZXggdmFyaWFibGUgZXJzdGVsbGVuDQogICAgd29yayA9IFJlY29kZSgNCiAgICAgIHdvcmssDQogICAgICAiMiA9IDE7DQogICAgICAgMyA9IDE7DQogICAgICAgNCA9IDA7DQogICAgICAgNSA9IDA7DQogICAgICAgNiA9IDA7DQogICAgICAgNyA9IDAiDQogICAgKQ0KICApICU+JQ0KICBzZWxlY3QoDQogICAgY250cnksIHllYXIsIGFnZSwgc2V4LCBpbmNvbWUsIGVkdWMsIHdvcmssIA0KICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCiAgKQ0KDQpib2xpdmlhXw0KDQoNCnNhdmUoYm9saXZpYV8sIGZpbGUgPSAiY29kZWJvb2tzL3NpbmdsZXMvYm9saXZpYV8uUmRhdGEiKQ0KYGBgDQoNCiMjIENhbmFkYQ0KDQpgYGB7cn0NCmxvYWQoY2FuYWRhX3VybCkNCg0KY2FuYWRhXyA8LSBjYW5hZGEgJT4lDQogIG11dGF0ZShjbnRyeSA9IHRvX2xhYmVsKHBhaXMpKSAlPiUNCiAgc2VsZWN0KA0KICAgIGNudHJ5LCBleGMxMywgZWR1Y2F0aW9uLCBxMTAsIHExLCBxMiwNCiAgICBiMTBhLCBiMTMsIGIxOCwgYjIxYSwgbjMsIHllYXINCiAgKSAlPiUNCiAgcmVuYW1lKA0KICAgIHdvcmsgPSBleGMxMywNCiAgICBlZHVjID0gZWR1Y2F0aW9uLA0KICAgIGluY29tZSA9IHExMCwNCiAgICBzZXggPSBxMSwNCiAgICBhZ2UgPSBxMiwNCiAgICB0cnVzdF9jb3VydHMgPSBiMTBhLA0KICAgIHRydXN0X3BhcmxpYW1lbnQgPSBiMTMsDQogICAgdHJ1c3RfcG9saWNlID0gYjE4LA0KICAgIHRydXN0X2dvdiA9IGIyMWEsDQogICAgIyBkZW10b2RheSA9IG4zDQogICkgJT4lDQogIG11dGF0ZSgNCiAgICBzZXggPSBzZXggLSAxLCAjIHNleCB2YXJpYWJsZSBlcnN0ZWxsZW4NCiAgICB3b3JrID0gd29yayAtIDEsDQogICAgaW5jb21lID0gaWZlbHNlKGluY29tZSA9PSA4OCwgTkEsIGluY29tZSkNCiAgKSAlPiUNCiAgc2VsZWN0KA0KICAgIGNudHJ5LCB5ZWFyLCBhZ2UsIHNleCwgaW5jb21lLCBlZHVjLCB3b3JrLCAgDQogICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cw0KICApDQoNCmNhbmFkYV8NCg0KDQpzYXZlKGNhbmFkYV8sIGZpbGUgPSAiY29kZWJvb2tzL3NpbmdsZXMvY2FuYWRhXy5SZGF0YSIpDQpgYGANCg0KIyMgTWVyZ2luZyB0aGUgRGF0YQ0KDQpgYGB7cn0NCmFtZXJpY2FzIDwtIGFtZXJpY2FzXyAlPiUgDQogIG11dGF0ZV9hdCgNCiAgICB2YXJzKA0KICAgICAgaW5jb21lLCBlZHVjLA0KICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCiAgICApLA0KICAgIHJhbmdlMDENCiAgKQ0KDQpib2xpdmlhIDwtIGJvbGl2aWFfICU+JSANCiAgbXV0YXRlX2F0KA0KICAgIHZhcnMoDQogICAgICBpbmNvbWUsIGVkdWMsDQogICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cw0KICAgICksDQogICAgcmFuZ2UwMQ0KICApDQoNCmNhbmFkYSA8LSBjYW5hZGFfICU+JSANCiAgbXV0YXRlX2F0KA0KICAgIHZhcnMoDQogICAgICBpbmNvbWUsIGVkdWMsDQogICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cw0KICAgICksDQogICAgcmFuZ2UwMQ0KICApDQoNCg0KYW1lcmljYXMgPC0gcmJpbmQoYW1lcmljYXMsIGJvbGl2aWEsIGNhbmFkYSkgJT4lIA0KICBtdXRhdGUoY250cnkgPSBhcy5jaGFyYWN0ZXIoY250cnkpKSAlPiUgDQogIG11dGF0ZShjbnRyeSA9IGlmZWxzZShjbnRyeSA9PSAiSGFpdMOtIiwgIkhhaXRpIiwgY250cnkpKQ0KDQphbWVyaWNhcw0KIyANCiMgdGFibGUoYW1lcmljYXMkY250cnkpDQpgYGANCg0KIyBBc2lhbiBCYXJvbWV0ZXINCg0KYGBge3J9DQpsb2FkKGFzaWFuX3Jhd191cmwpDQoNCmRlbGV0ZV9uYV9hc2lhbiA8LSBmdW5jdGlvbih4KSB7DQogIHggPC0gUmVjb2RlKA0KICAgIHgsDQogICAgIi0yID0gTkE7DQogICAgICA3ID0gTkE7DQogICAgICA4ID0gTkE7DQogICAgICA5ID0gTkE7DQogICAgIDk3ID0gTkE7DQogICAgIDk4ID0gTkE7DQogICAgIDk5ID0gTkE7DQogICAgIC0xID0gTkEiDQogICkNCg0KICByZXR1cm4oeCkNCn0gIyBGdW5rdGlvbiB1bSBkaWUgTkFzIGltIGFzaWFuIERhdGVuc2F0eiB6dSBiZXN0aW1tZW4NCg0KYXNpYW5fMyA8LSBhc2lhbl9yYXcgJT4lDQogIHJlbmFtZSgNCiAgICBlZHVjID0gc2U1LA0KICAgIHRydXN0X2dvdiA9IHE5LA0KICAgIHRydXN0X3BhcmxpYW1lbnQgPSBxMTEsDQogICAgdHJ1c3RfcG9saWNlID0gcTE0LA0KICAgIHRydXN0X2NvdXJ0cyA9IHE4LA0KICAgIHNleCA9IHNlMiwNCiAgICBpbmNvbWUgPSBzZTEzYSwNCiAgICB3b3JrID0gc2U5DQogICkgJT4lDQogIG11dGF0ZV9hdCgNCiAgICB2YXJzKA0KICAgICAgaW5jb21lLCB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cywgd29yaywgc2V4DQogICAgKSwNCiAgICBkZWxldGVfbmFfYXNpYW4NCiAgKSAlPiUgIyBOQXMgZGVsZXRlbg0KICBtdXRhdGUoDQogICAgdHJ1c3RfZ292ID0gNSAtIHRydXN0X2dvdiwNCiAgICB0cnVzdF9wYXJsaWFtZW50ID0gNSAtIHRydXN0X3BhcmxpYW1lbnQsDQogICAgdHJ1c3RfcG9saWNlID0gNSAtIHRydXN0X3BvbGljZSwNCiAgICB0cnVzdF9jb3VydHMgPSA1IC0gdHJ1c3RfY291cnRzLA0KICAgIHNleCA9IHNleCAtIDEsICMgc2V4ICgwLzEpIGNvZGllcmVuDQogICAgaW5jb21lID0gUmVjb2RlKA0KICAgICAgaW5jb21lLA0KICAgICAgIjAgPSBOQSINCiAgICApLA0KICAgIGluY29tZSA9IDUgLSBpbmNvbWUsDQogICAgd29yayA9IFJlY29kZSgNCiAgICAgIHdvcmssICMgd29yayAoMC8xKSBjb2RpZXJlbg0KICAgICAgIjIgPSAwIg0KICAgICksDQogICAgYWdlID0gUmVjb2RlKA0KICAgICAgc2UzYSwgIyBtaXNzaW5nIHZhbHVlcyBsP3NjaGVuDQogICAgICAiLTEgPSBOQSINCiAgICApLA0KICAgICMgZGVtdG9kYXkgPSBSZWNvZGUoDQogICAgIyAgIHE5MSwNCiAgICAjICAgIi0xID0gTkE7DQogICAgIyAgICA5NyA9IE5BOw0KICAgICMgICAgOTggPSBOQTsNCiAgICAjICAgIDk5ID0gTkEiDQogICAgIyApLA0KICAgIGVkdWMgPSBSZWNvZGUoDQogICAgICBlZHVjLA0KICAgICAgIi0xID0gTkE7DQogICAgICAgOTggPSBOQTsNCiAgICAgICA5OSA9IE5BIg0KICAgICksDQogICAgY250cnkgPSB0b19sYWJlbChjb3VudHJ5KSwNCiAgICB5ZWFyID0gYXMubnVtZXJpYyhmb3JtYXQoaXI5LCAiJVkiKSkNCiAgKSAlPiUNCiAgc2VsZWN0KA0KICAgIGNudHJ5LCB5ZWFyLCBhZ2UsIHNleCwgaW5jb21lLCBlZHVjLCB3b3JrLCANCiAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzDQogICkgDQoNCmFzaWFuXzMNCg0KDQpzYXZlKGFzaWFuXzMsIGZpbGUgPSAiY29kZWJvb2tzL3NpbmdsZXMvYXNpYW5fMy5SZGF0YSIpDQpgYGANCg0KIyMgV2F2ZSA0DQoNCmBgYHtyfQ0KbG9hZChteWFubWFyX3Jhd191cmwpDQoNCm5lZWRlZCA8LSBmdW5jdGlvbihkYXRhKSB7DQogIHNzIDwtIGRhdGEgJT4lDQogICAgcmVuYW1lKA0KICAgICAgZWR1YyA9IHNlNSwNCiAgICAgIHRydXN0X2dvdiA9IHE5LA0KICAgICAgdHJ1c3RfcGFybGlhbWVudCA9IHExMSwNCiAgICAgIHRydXN0X3BvbGljZSA9IHExNCwNCiAgICAgIHRydXN0X2NvdXJ0cyA9IHE4LA0KICAgICAgc2V4ID0gc2UyLA0KICAgICAgaW5jb21lID0gc2UxM2EsDQogICAgICB3b3JrID0gc2U5DQogICAgKSAlPiUNCiAgICBtdXRhdGVfYXQoDQogICAgICB2YXJzKA0KICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzLCB3b3JrLCBzZXgNCiAgICAgICksDQogICAgICBkZWxldGVfbmFfYXNpYW4NCiAgICApICU+JSAjIE5BcyBkZWxldGVuDQogICAgbXV0YXRlKA0KICAgICAgdHJ1c3RfZ292ID0gNSAtIHRydXN0X2dvdiwNCiAgICAgIHRydXN0X3BhcmxpYW1lbnQgPSA1IC0gdHJ1c3RfcGFybGlhbWVudCwNCiAgICAgIHRydXN0X3BvbGljZSA9IDUgLSB0cnVzdF9wb2xpY2UsDQogICAgICB0cnVzdF9jb3VydHMgPSA1IC0gdHJ1c3RfY291cnRzLA0KICAgICAgc2V4ID0gc2V4IC0gMSwgIyBzZXggKDAvMSkgY29kaWVyZW4NCiAgICAgIGluY29tZSA9IFJlY29kZSgNCiAgICAgICAgaW5jb21lLA0KICAgICAgICAiMCA9IE5BOw0KICAgICAgICA5NyA9IE5BOw0KICAgICAgICA5OCA9IE5BOw0KICAgICAgICA5OSA9IE5BOw0KICAgICAgICAtMSA9IE5BIg0KICAgICAgKSwNCiAgICAgIHdvcmsgPSBSZWNvZGUoDQogICAgICAgIHdvcmssICMgd29yayAoMC8xKSBjb2RpZXJlbg0KICAgICAgICAiMiA9IDAiDQogICAgICApLA0KICAgICAgYWdlID0gUmVjb2RlKA0KICAgICAgICBzZTNfMiwgIyBtaXNzaW5nIHZhbHVlcyBsP3NjaGVuDQogICAgICAgICItMSA9IE5BIg0KICAgICAgKSwNCiAgICAgICMgZGVtdG9kYXkgPSBSZWNvZGUoDQogICAgICAjICAgcTk0LA0KICAgICAgIyAgICItMSA9IE5BOw0KICAgICAgIyAgICA5NyA9IE5BOw0KICAgICAgIyAgICA5OCA9IE5BOw0KICAgICAgIyAgICA5OSA9IE5BIg0KICAgICAgIyApLA0KICAgICAgZWR1YyA9IFJlY29kZSgNCiAgICAgICAgZWR1YywNCiAgICAgICAgIi0xID0gTkE7DQogICAgICAgICA5OCA9IE5BOw0KICAgICAgICAgOTkgPSBOQSINCiAgICAgICksDQogICAgICBjbnRyeSA9IHRvX2xhYmVsKGNvdW50cnkpLA0KICAgICAgeWVhciA9IHllYXINCiAgICApICU+JQ0KICAgIHNlbGVjdCgNCiAgICAgIGNudHJ5LCB5ZWFyLCBhZ2UsIHNleCwgaW5jb21lLCBlZHVjLCB3b3JrLCANCiAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCiAgICApDQogIA0KICByZXR1cm4oc3MpDQp9DQpteWFubWFyIDwtIG5lZWRlZChteWFubWFyX3JhdykNCg0KbG9hZChtb25nb2xpYV9yYXdfdXJsKQ0KbG9hZChwaGlsaXBfcmF3X3VybCkNCmxvYWQodGFpd2FuX3Jhd191cmwpDQpsb2FkKHRoYWlfcmF3X3VybCkNCmxvYWQobWFsYXlfcmF3X3VybCkNCmxvYWQoc2luZ2Fwb3JlX3Jhd191cmwpDQpsb2FkKHNrX3Jhd191cmwpDQpsb2FkKGNhbWJvZGlhX3Jhd191cmwpDQoNCm1vbmdvbGlhICA8LSBuZWVkZWQobW9uZ29saWFfcmF3KQ0KcGhpbGlwICAgIDwtIG5lZWRlZChwaGlsaXBfcmF3KQ0KDQp0aGFpICAgICAgPC0gbmVlZGVkKHRoYWlfcmF3KQ0KbWFsYXkgICAgIDwtIG5lZWRlZChtYWxheV9yYXcpDQpzaW5nYXBvcmUgPC0gbmVlZGVkKHNpbmdhcG9yZV9yYXcpICMgU2luZ2Fwb3JlIGhhdCBleHRyZW0gdmllbGUgTWlzc2luZyB2YWx1ZXMNCnNrICAgICAgICA8LSBuZWVkZWQoc2tfcmF3KQ0KY2FtYm9kaWEgIDwtIG5lZWRlZChjYW1ib2RpYV9yYXcpDQoNCnNhdmUobXlhbm1hciwgZmlsZSA9ICJjb2RlYm9va3Mvc2luZ2xlcy9teWFubWFyLlJkYXRhIikNCnNhdmUobW9uZ29saWEsIGZpbGUgPSAiY29kZWJvb2tzL3NpbmdsZXMvbW9uZ29saWEuUmRhdGEiKQ0Kc2F2ZShwaGlsaXAsIGZpbGUgPSAiY29kZWJvb2tzL3NpbmdsZXMvcGhpbGlwLlJkYXRhIikNCnNhdmUodGhhaSwgZmlsZSA9ICJjb2RlYm9va3Mvc2luZ2xlcy90aGFpLlJkYXRhIikNCnNhdmUobWFsYXksIGZpbGUgPSAiY29kZWJvb2tzL3NpbmdsZXMvbWFsYXkuUmRhdGEiKQ0Kc2F2ZShzaW5nYXBvcmUsIGZpbGUgPSAiY29kZWJvb2tzL3NpbmdsZXMvc2luZ2Fwb3JlLlJkYXRhIikNCnNhdmUoc2ssIGZpbGUgPSAiY29kZWJvb2tzL3NpbmdsZXMvc2suUmRhdGEiKQ0Kc2F2ZShjYW1ib2RpYSwgZmlsZSA9ICJjb2RlYm9va3Mvc2luZ2xlcy9jYW1ib2RpYS5SZGF0YSIpDQpgYGANCiMjIFNvbmRlcmZhbGwgVGFpd2FuDQoNCmBgYHtyfQ0KDQojIFRhaXdhbiBQcm9ibGVtOiBJbmNvbWUgb25seSBoYXMgMyBjYXRlZ29yaWVzDQoNCnRhaXdhbiA8LSB0YWl3YW5fcmF3ICU+JQ0KICAgIHJlbmFtZSgNCiAgICAgIGVkdWMgPSBzZTUsDQogICAgICB0cnVzdF9nb3YgPSBxOSwNCiAgICAgIHRydXN0X3BhcmxpYW1lbnQgPSBxMTEsDQogICAgICB0cnVzdF9wb2xpY2UgPSBxMTQsDQogICAgICB0cnVzdF9jb3VydHMgPSBxOCwNCiAgICAgIHNleCA9IHNlMiwNCiAgICAgIGluY29tZSA9IHNlMTRhLA0KICAgICAgd29yayA9IHNlOQ0KICAgICkgJT4lDQogICAgbXV0YXRlX2F0KA0KICAgICAgdmFycygNCiAgICAgICAgaW5jb21lLCB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzLCB3b3JrLCBzZXgNCiAgICAgICksDQogICAgICBkZWxldGVfbmFfYXNpYW4NCiAgICApICU+JSAjIE5BcyBkZWxldGVuDQogICAgbXV0YXRlKA0KICAgICAgdHJ1c3RfZ292ID0gNSAtIHRydXN0X2dvdiwNCiAgICAgIHRydXN0X3BhcmxpYW1lbnQgPSA1IC0gdHJ1c3RfcGFybGlhbWVudCwNCiAgICAgIHRydXN0X3BvbGljZSA9IDUgLSB0cnVzdF9wb2xpY2UsDQogICAgICB0cnVzdF9jb3VydHMgPSA1IC0gdHJ1c3RfY291cnRzLA0KICAgICAgc2V4ID0gc2V4IC0gMSwgIyBzZXggKDAvMSkgY29kaWVyZW4NCiAgICAgIGluY29tZSA9IFJlY29kZSgNCiAgICAgICAgNCAtIGluY29tZSwNCiAgICAgICAgIjggPSBOQTsNCiAgICAgICAgIDkgPSBOQSINCiAgICAgICksDQogICAgICB3b3JrID0gUmVjb2RlKA0KICAgICAgICB3b3JrLCAjIHdvcmsgKDAvMSkgY29kaWVyZW4NCiAgICAgICAgIjIgPSAwIg0KICAgICAgKSwNCiAgICAgIGFnZSA9IFJlY29kZSgNCiAgICAgICAgc2UzXzIsICMgbWlzc2luZyB2YWx1ZXMgbD9zY2hlbg0KICAgICAgICAiLTEgPSBOQSINCiAgICAgICksDQogICAgICAjIGRlbXRvZGF5ID0gUmVjb2RlKA0KICAgICAgIyAgIHE5NCwNCiAgICAgICMgICAiLTEgPSBOQTsNCiAgICAgICMgICAgOTcgPSBOQTsNCiAgICAgICMgICAgOTggPSBOQTsNCiAgICAgICMgICAgOTkgPSBOQSINCiAgICAgICMgKSwNCiAgICAgIGVkdWMgPSBSZWNvZGUoDQogICAgICAgIGVkdWMsDQogICAgICAgICItMSA9IE5BOw0KICAgICAgICAgOTggPSBOQTsNCiAgICAgICAgIDk5ID0gTkEiDQogICAgICApLA0KICAgICAgY250cnkgPSB0b19sYWJlbChjb3VudHJ5KSwNCiAgICAgIHllYXIgPSB5ZWFyDQogICAgKSAlPiUNCiAgICBzZWxlY3QoDQogICAgICBjbnRyeSwgeWVhciwgYWdlLCBzZXgsIGluY29tZSwgZWR1Yywgd29yaywgIA0KICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cw0KICAgICkNCg0KDQpzYXZlKHRhaXdhbiwgZmlsZSA9ICJjb2RlYm9va3Mvc2luZ2xlcy90YWl3YW4uUmRhdGEiKQ0KDQpgYGANCg0KDQojIyBNZXJnaW5nIERhdGENCg0KYGBge3J9DQoNCmFzaWFuXzMgJTw+JQ0KICAgIG11dGF0ZV9hdCgNCiAgICAgIHZhcnMoDQogICAgICAgIGluY29tZSwgZWR1YywNCiAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cw0KICAgICAgKSwNCiAgICAgIHJhbmdlMDENCiAgICApDQoNCm15YW5tYXIgJTw+JQ0KICAgIG11dGF0ZV9hdCgNCiAgICAgIHZhcnMoDQogICAgICAgIGluY29tZSwgZWR1YywNCiAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cw0KICAgICAgKSwNCiAgICAgIHJhbmdlMDENCiAgICApDQoNCm1vbmdvbGlhICU8PiUNCiAgICBtdXRhdGVfYXQoDQogICAgICB2YXJzKA0KICAgICAgICBpbmNvbWUsIGVkdWMsDQogICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCiAgICAgICksDQogICAgICByYW5nZTAxDQogICAgKQ0KDQpwaGlsaXAgJTw+JQ0KICAgIG11dGF0ZV9hdCgNCiAgICAgIHZhcnMoDQogICAgICAgIGluY29tZSwgZWR1YywNCiAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cw0KICAgICAgKSwNCiAgICAgIHJhbmdlMDENCiAgICApICANCg0KdGFpd2FuICU8PiUNCiAgICBtdXRhdGVfYXQoDQogICAgICB2YXJzKA0KICAgICAgICBpbmNvbWUsIGVkdWMsDQogICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCiAgICAgICksDQogICAgICByYW5nZTAxDQogICAgKSAgDQoNCnRoYWkgJTw+JQ0KICAgIG11dGF0ZV9hdCgNCiAgICAgIHZhcnMoDQogICAgICAgIGluY29tZSwgZWR1YywNCiAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cw0KICAgICAgKSwNCiAgICAgIHJhbmdlMDENCiAgICApDQoNCm1hbGF5ICU8PiUNCiAgICBtdXRhdGVfYXQoDQogICAgICB2YXJzKA0KICAgICAgICBpbmNvbWUsIGVkdWMsDQogICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCiAgICAgICksDQogICAgICByYW5nZTAxDQogICAgKQ0KDQpzaW5nYXBvcmUgJTw+JQ0KICAgIG11dGF0ZV9hdCgNCiAgICAgIHZhcnMoDQogICAgICAgIGluY29tZSwgZWR1YywNCiAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cw0KICAgICAgKSwNCiAgICAgIHJhbmdlMDENCiAgICApDQoNCnNrICU8PiUNCiAgICBtdXRhdGVfYXQoDQogICAgICB2YXJzKA0KICAgICAgICBpbmNvbWUsIGVkdWMsDQogICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwNCiAgICAgICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCiAgICAgICksDQogICAgICByYW5nZTAxDQogICAgKQ0KDQpjYW1ib2RpYSAlPD4lDQogICAgbXV0YXRlX2F0KA0KICAgICAgdmFycygNCiAgICAgICAgaW5jb21lLCBlZHVjLA0KICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzDQogICAgICApLA0KICAgICAgcmFuZ2UwMQ0KICAgICkNCg0KYXNpYW4gPC0gcmJpbmQoDQogIGFzaWFuXzMsIG15YW5tYXIsIGNhbWJvZGlhLCBzaywgc2luZ2Fwb3JlLCBtYWxheSwgdGhhaSwgdGFpd2FuLCBwaGlsaXAsDQogIGNhbWJvZGlhLCBtb25nb2xpYQ0KKSAlPiUgYXMudGJsKCkNCg0KYXNpYW4NCmBgYA0KDQoNCiMgRXVyb3BlYW4gU29jaWFsIFN1cnZleQ0KDQpgYGB7cn0NCmxvYWQoRVNTX3Jhd191cmwpDQoNCkVTUyA8LSBFU1NfcmF3ICU+JQ0KICByZW5hbWUoDQogICAgIyBkZW10b2RheSA9IGRtY250b3YsDQogICAgYWdlID0gYWdlYSwNCiAgICB5ZWFyID0gaW53eXlzLA0KICAgIHRydXN0X2dvdiA9IHRyc3RwbHQsDQogICAgdHJ1c3RfcGFybGlhbWVudCA9IHRyc3RwcmwsDQogICAgdHJ1c3RfcG9saWNlID0gdHJzdHBsYywNCiAgICB0cnVzdF9jb3VydHMgPSB0cnN0bGdsDQogICkgJT4lDQogIG11dGF0ZSgNCiAgICBpbmNvbWUgPSA1IC0gaGluY2ZlbCwNCiAgICBlZHVjID0gUmVjb2RlKA0KICAgICAgZWlzY2VkLA0KICAgICAgIjU1ID0gTkEiDQogICAgKSwNCiAgICB3b3JrID0gaWZlbHNlKG1uYWN0aWMgPT0gMSwgMSwgMCksDQogICAgc2V4ID0gZ25kciAtIDEsICMgc2V4IHZhcmlhYmxlIGVyc3RlbGxlbg0KICAgIGNudHJ5ID0gdG9fbGFiZWwoY250cnkpDQogICkgJT4lICANCiAgc2VsZWN0KA0KICAgIGNudHJ5LCB5ZWFyLCBhZ2UsIHNleCwgaW5jb21lLCBlZHVjLCB3b3JrLCB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICAgdHJ1c3RfcG9saWNlLCB0cnVzdF9jb3VydHMNCiAgKQ0KDQoNCkVTUw0KDQoNCnNhdmUoRVNTLCBmaWxlID0gImNvZGVib29rcy9zaW5nbGVzL0VTUy5SZGF0YSIpDQpgYGANCg0KDQojIE1lcmdpbmcgRXZlcnl0aGluZw0KDQpgYGB7cn0NCg0KYWZybyAlPD4lIA0KICBtdXRhdGUoc3VydmV5ID0gcmVwKCJhZnJvIiwgbnJvdyhhZnJvKSkpICU+JSANCiAgbXV0YXRlKGNudHJ5ID0gY291bnRyeWNvZGUoY250cnksICJjb3VudHJ5Lm5hbWUiLCAiY291bnRyeS5uYW1lIikpIA0KDQpsYXRpbm8gJTw+JSAgDQogIG11dGF0ZShzdXJ2ZXkgPSByZXAoImxhdGlubyIsIG5yb3cobGF0aW5vKSkpICU+JSANCiAgbXV0YXRlKGNudHJ5ID0gY291bnRyeWNvZGUoY250cnksICJjb3VudHJ5Lm5hbWUiLCAiY291bnRyeS5uYW1lIikpDQoNCmFtZXJpY2FzICU8PiUgIA0KICBtdXRhdGUoc3VydmV5ID0gcmVwKCJhbWVyaWNhcyIsIG5yb3coYW1lcmljYXMpKSkgJT4lIA0KICBtdXRhdGUoY250cnkgPSBjb3VudHJ5Y29kZShjbnRyeSwgImNvdW50cnkubmFtZSIsICJjb3VudHJ5Lm5hbWUiKSkNCg0KYXNpYW4gJTw+JSAgDQogIG11dGF0ZShzdXJ2ZXkgPSByZXAoImFzaWFuIiwgbnJvdyhhc2lhbikpKSAlPiUgDQogIG11dGF0ZShjbnRyeSA9IGNvdW50cnljb2RlKGNudHJ5LCAiY291bnRyeS5uYW1lIiwgImNvdW50cnkubmFtZSIpKQ0KDQp3dnMgJTw+JSAgDQogIG11dGF0ZShzdXJ2ZXkgPSByZXAoInd2cyIsIG5yb3cod3ZzKSkpICU+JSANCiAgbXV0YXRlKGNudHJ5ID0gY291bnRyeWNvZGUoY250cnksICJjb3VudHJ5Lm5hbWUiLCAiY291bnRyeS5uYW1lIikpICU+JQ0KICAgIG11dGF0ZV9hdCgNCiAgICAgIHZhcnMoDQogICAgICAgIGluY29tZSwgZWR1YywNCiAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cw0KICAgICAgKSwNCiAgICAgIHJhbmdlMDENCiAgICApDQoNCkVTUyAlPD4lICANCiAgbXV0YXRlKHN1cnZleSA9IHJlcCgiRVNTIiwgbnJvdyhFU1MpKSkgJT4lIA0KICBtdXRhdGUoY250cnkgPSBjb3VudHJ5Y29kZShjbnRyeSwgImNvdW50cnkubmFtZSIsICJjb3VudHJ5Lm5hbWUiKSkgJT4lDQogICAgbXV0YXRlX2F0KA0KICAgIHZhcnMoDQogICAgICBpbmNvbWUsIGVkdWMsDQogICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cw0KICAgICksDQogICAgc3Rkeg0KICApICU+JQ0KICAgIG11dGF0ZV9hdCgNCiAgICAgIHZhcnMoDQogICAgICAgIGluY29tZSwgZWR1YywNCiAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LA0KICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cw0KICAgICAgKSwNCiAgICAgIHJhbmdlMDENCiAgICApIA0KDQp1bmlxdWUoRVNTJGNudHJ5KQ0KdW5pcXVlKGFzaWFuJGNudHJ5KQ0KdW5pcXVlKHd2cyRjbnRyeSkNCnVuaXF1ZShsYXRpbm8kY250cnkpDQp1bmlxdWUoYW1lcmljYXMkY250cnkpDQp1bmlxdWUoYWZybyRjbnRyeSkNCg0KbWVyZ2VkIDwtIHJiaW5kKHd2cywgbGF0aW5vLCBhZnJvLCBhbWVyaWNhcywgYXNpYW4sIEVTUykNCg0KbWVyZ2VkICU8PiUNCiAgIyBjcmVhdGUgZHVtbWllcw0KICBtdXRhdGUoDQogICAgd3ZzID0gaWZlbHNlKHN1cnZleSA9PSAid3ZzIiwgMSwgMCksDQogICAgYWZybyA9IGlmZWxzZShzdXJ2ZXkgPT0gImFmcm8iLCAxLCAwKSwNCiAgICBsYXRpbm8gPSBpZmVsc2Uoc3VydmV5ID09ICJsYXRpbm8iLCAxLCAwKSwNCiAgICBhbWVyaWNhcyA9IGlmZWxzZShzdXJ2ZXkgPT0gImFtZXJpY2FzIiwgMSwgMCksDQogICAgYXNpYW4gPSBpZmVsc2Uoc3VydmV5ID09ICJhc2lhbiIsIDEsIDApLA0KICAgIEVTUyA9IGlmZWxzZShzdXJ2ZXkgPT0gIkVTUyIsIDEsIDApDQogICkgJT4lDQogICMgZmlsdGVyIGJhZCBjb3VudHJpZXMNCiAgZmlsdGVyKCEoY250cnkgPT0gIkVneXB0IiAmIHllYXIgPT0gMjAxMykpICU+JSAjIGV4Y2x1ZGUgRWd5cHQgMjAxMw0KICBmaWx0ZXIoIShjbnRyeSA9PSAiTGlieWEiICYgeWVhciA9PSAyMDE0KSkgJT4lICMgZXhjbHVkZSBMaWJ5YSAyMDE0DQogIGZpbHRlcighKGNudHJ5ID09ICJNYWxpIiAmIHllYXIgPT0gMjAxMikpICU+JSAjIGV4Y2x1ZGUgTWFsaSAyMDEyDQogIGZpbHRlcighKGNudHJ5ID09ICJZZW1lbiIgJiB5ZWFyID09IDIwMTIpKSAlPiUgIyBleGNsdWRlIFllbWVuIDIwMTINCiAgZmlsdGVyKCEoY250cnkgPT0gIlBhbGVzdGluZSwgU3RhdGUgb2YiICYgeWVhciA9PSAyMDEzKSkgIyBleGNsdWRlIFBhbGVzdGluZSAyMDEzDQoNCiMgYWRkaW5nIHdlaWdodA0Kbm90X2NoYXJhY3RlciA8LSBmdW5jdGlvbih4KSB7DQogICEoaXMuY2hhcmFjdGVyKHgpKQ0KfQ0KDQptZXJnZWQgJTw+JQ0KICBncm91cF9ieShjbnRyeSkgJT4lDQogIHRhbGx5KCkgJT4lDQogIG11dGF0ZSh3ZWlnaHQgPSAxMDAwIC8gbikgJT4lDQogIHNlbGVjdChjbnRyeSwgd2VpZ2h0KSAlPiUNCiAgbGVmdF9qb2luKG1lcmdlZCwgImNudHJ5IikgJT4lIA0KICBtdXRhdGVfaWYobm90X2NoYXJhY3RlciwgYXMubnVtZXJpYykNCiMgc2VsZWN0KGNudHJ5LCB5ZWFyKSAlPiUNCiMgdW5pcXVlICU+JQ0KIyBWaWV3DQoNCm1lcmdlZA0KDQp0YWJsZShtZXJnZWQkd3ZzKQ0KdGFibGUobWVyZ2VkJGFmcm8pDQp0YWJsZShtZXJnZWQkbGF0aW5vKQ0KdGFibGUobWVyZ2VkJGFtZXJpY2FzKQ0KdGFibGUobWVyZ2VkJGFzaWFuKQ0KdGFibGUobWVyZ2VkJEVTUykNCmBgYA0KDQoNCiMjIEZhY3RvciBBbmFseXNpcw0KDQpgYGB7cn0NCiNUT0RPIHRvZG9yOjoNCg0KbWVyZ2VkICU+JSANCiAgc2VsZWN0KHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwgDQogICAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzKSAlPiUgDQogIHBzeWNoOjphbHBoYSgpDQoNCm1lcmdlZCAlPiUgDQogIHNlbGVjdCh0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsIA0KICAgICAgICAgICB0cnVzdF9wb2xpY2UsIHRydXN0X2NvdXJ0cykgJT4lIA0KICBwc3ljaDo6S01PKCkNCg0KDQptZXJnZWQgJTw+JSANCiAgc2VsZWN0KHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwgDQogICAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMubnVtZXJpYykgJT4lIA0KICBwc3ljaDo6ZmEod2VpZ2h0ID0gbWVyZ2VkJHdlaWdodCkgJT4lIA0KICBwc3ljaDo6cHJlZGljdC5wc3ljaChkYXRhID0gbWVyZ2VkICU+JSANCiAgc2VsZWN0KHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwgDQogICAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzKSkgJT4lDQogIGFzLmRhdGEuZnJhbWUoKSAlPiUNCiAgdHJhbnNtdXRlKGdvdl90cnVzdCA9IHJhbmdlMDEoTVIxKSkgJT4lDQogIGNiaW5kKG1lcmdlZCkNCg0KbWVyZ2VkDQpgYGANCg0KDQoNCg0KDQojIyBTb21lIFJlY29kaW5nDQoNCmBgYHtyfQ0KdGFibGUobWVyZ2VkJGNudHJ5LCBtZXJnZWQkeWVhcikNCg0KdGFibGUoc3Vic2V0KG1lcmdlZCxtZXJnZWQkY250cnk9PSJDaGluYSIpJHN1cnZleSwNCiAgICAgIHN1YnNldChtZXJnZWQsbWVyZ2VkJGNudHJ5PT0iQ2hpbmEiKSR5ZWFyKQ0KDQptZXJnZWQgJTw+JSANCiAgbXV0YXRlKHllYXIgPSBjYXNlX3doZW4oDQogICAgICBjbnRyeSA9PSAiQ2hpbmEiICYgeWVhciA9PSAxNTgzIH4gMjAxMSwNCiAgICAgIGNudHJ5ID09ICJDaGluYSIgJiB5ZWFyID09IDIwMDAgfiAyMDExLA0KICAgICAgY250cnkgPT0gIkNoaW5hIiAmIHllYXIgPT0gMjA3NyB+IDIwMTEsDQogICAgICBjbnRyeSA9PSAiQ2hpbmEiICYgeWVhciA9PSAyMDEyIH4gMjAxMSwNCiAgICAgIGNudHJ5ID09ICJTaW5nYXBvcmUiICYgeWVhciA9PSAxNTgyIH4gMjAxMSwNCiAgICAgIFRSVUUgfiB5ZWFyDQogICAgICANCiAgKSkNCg0KIyBtZXJnZWQkeWVhclttZXJnZWQkY250cnk9PSJDaGluYSIgJiBtZXJnZWQkeWVhciA9PSAyMDAwXSA8LSAyMDExDQojIG1lcmdlZCR5ZWFyW21lcmdlZCRjbnRyeT09IkNoaW5hIiAmIG1lcmdlZCR5ZWFyID09IDIwNzddIDwtIDIwMTENCiMgbWVyZ2VkJHllYXJbbWVyZ2VkJGNudHJ5PT0iQ2hpbmEiICYgbWVyZ2VkJHllYXIgPT0gMjAxMl0gPC0gMjAxMQ0KDQp0YWJsZShzdWJzZXQobWVyZ2VkLG1lcmdlZCRjbnRyeT09IlNpbmdhcG9yZSIpJHN1cnZleSwNCiAgICAgIHN1YnNldChtZXJnZWQsbWVyZ2VkJGNudHJ5PT0iU2luZ2Fwb3JlIikkeWVhcikNCg0KIyBtZXJnZWQkeWVhclttZXJnZWQkY250cnk9PSJTaW5nYXBvcmUiICYgbWVyZ2VkJHllYXIgPT0gMTU4Ml0gPC0gMjAxMQ0KDQpoaXN0KG1lcmdlZCRnb3ZfdHJ1c3QpDQoNCnNhdmUobWVyZ2VkLCBmaWxlID0gImRhdGEvbGV2ZWwxLlJkYXRhIikNCg0KbWVyZ2VkICU+JSBzZWxlY3QoY250cnkpICU+JSB1bmlxdWUoKQ0KYGBgDQoNCg0KDQoNCiMgTGV2ZWwgMiBEYXRhDQoNCiMjIFYtRGVtDQoNCmBgYHtyfQ0KDQoNCg0KbG9hZCh2ZGVtc19zdGFydF91cmwpDQoNCnZkZW1zX3N1YiA8LSB2ZGVtc19zdGFydCAlPiUgZmlsdGVyKHllYXIgJWluJSAyMDAwOjIwMTApDQoNCiN0aWJibGUoaWQgPSAxOjE4OTYpDQojdGFibGUodmRlbXNfc3ViJGNvdW50cnlfbmFtZSkNCg0KdmRlbSA8LSB2ZGVtc19zdGFydCAlPiUNCiAgZmlsdGVyKHllYXIgJWluJSAyMDAwOjIwMTApICU+JSANCiAgZ3JvdXBfYnkoY291bnRyeV9uYW1lKSAlPiUNCiAgdGFsbHkgJT4lDQogIG11dGF0ZShjbnRyeSA9IHVuaXF1ZShjb3VudHJ5X25hbWUpKSAlPiUNCiAgI0RDSSBWYXJpYWJsZXMNCiAgbXV0YXRlKGRlbGliMTAgPSB2ZGVtc19zdWIgJT4lDQogICAgICAgICAgIGRjYXN0KGNvdW50cnlfbmFtZSB+IHllYXIsIA0KICAgICAgICAgICAgICAgICB2YWx1ZS52YXI9YygidjJ4ZGxfZGVsaWIiKSkgJT4lDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JQ0KICBtdXRhdGUoY29uc3VsdDEwID0gdmRlbXNfc3ViICU+JSANCiAgICAgICAgICAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJ2MmRsY29uc2x0IikpICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUNCiAgbXV0YXRlKHJlYXNvbjEwID0gdmRlbXNfc3ViICU+JSANCiAgICAgICAgICAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJ2MmRscmVhc29uIikpICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUNCiAgbXV0YXRlKGNvbW1vbjEwID0gdmRlbXNfc3ViICU+JSANCiAgICAgICAgICAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJ2MmRsY29tbW9uIikpICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUNCiAgbXV0YXRlKGNvdW50cjEwID0gdmRlbXNfc3ViICU+JSANCiAgICAgICAgICAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJ2MmRsY291bnRyIikpICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUNCiAgbXV0YXRlKGVuZ2FnZTEwID0gdmRlbXNfc3ViICU+JSANCiAgICAgICAgICAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJ2MmRsZW5nYWdlIikpICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUNCiAgbXV0YXRlKGRlbGliZGVtMTAgPSB2ZGVtc19zdWIgJT4lIA0KICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoInYyeF9kZWxpYmRlbSIpKSAlPiUNCiAgICAgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KICAgICAgICAgICByb3dNZWFucykgJT4lDQogICMgQ29udHJvbCBWYXJpYWJsZXMNCiAgbXV0YXRlKHBvbGl0eTEwID0gdmRlbXNfc3ViICU+JSANCiAgICAgICAgICAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJlX2ZoX2lwb2xpdHkyIikpICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUNCiAgbXV0YXRlKHBvbHkxMCA9IHZkZW1zX3N1YiAlPiUgDQogICAgICAgICAgIGRjYXN0KGNvdW50cnlfbmFtZSB+IHllYXIsIA0KICAgICAgICAgICAgICAgICB2YWx1ZS52YXI9YygidjJ4X3BvbHlhcmNoeSIpKSAlPiUNCiAgICAgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KICAgICAgICAgICByb3dNZWFucykgJT4lDQogIG11dGF0ZShyb2wxMCA9IHZkZW1zX3N1YiAlPiUgDQogICAgICAgICAgIGRjYXN0KGNvdW50cnlfbmFtZSB+IHllYXIsIA0KICAgICAgICAgICAgICAgICB2YWx1ZS52YXI9YygiZV93YmdpX3JsZSIpKSAlPiUNCiAgICAgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KICAgICAgICAgICByb3dNZWFucykgJT4lDQojICBtdXRhdGUoZ2RwMTAgPSB2ZGVtc19zdWIgJT4lIGZpbHRlcih5ZWFyICVpbiUgMjAwMDoyMDA4KSAlPiUgDQojICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiMgICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJlX0dEUF9QZXJfQ2FwX0hhYmVyX01lbl8yIikpICU+JSANCiMgICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiMgICAgICAgICAgIHJvd01lYW5zKSAlPiUNCiAgbXV0YXRlKHJpdzEwID0gdmRlbXNfc3ViICU+JSANCiAgICAgICAgICAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJlX3YyeF9yZWdpbWVfY2kiKSkgJT4lDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JQ0KICBtdXRhdGUoY29yZWNpdmlsMTAgPSB2ZGVtc19zdWIgJT4lIA0KICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoInYyeGNzX2Njc2kiKSkgJT4lDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JQ0KICBtdXRhdGUocG9wMTAgPSB2ZGVtc19zdWIgJT4lIA0KICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoImVfbWlwb3B1bGEiKSkgJT4lDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JQ0KICBtdXRhdGUoY29ycnVwdGlvbjEwID0gdmRlbXNfc3ViICU+JSANCiAgICAgICAgICAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJ2MnhfY29yciIpKSAlPiUNCiAgICAgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KICAgICAgICAgICByb3dNZWFucykgJT4lDQogIG11dGF0ZShwb2xraWxsMTAgPSB2ZGVtc19zdWIgJT4lIA0KICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoInYyeF9jbHBoeSIpKSAlPiUNCiAgICAgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KICAgICAgICAgICByb3dNZWFucykgJT4lDQogIG11dGF0ZShlZHVjMTAgPSB2ZGVtc19zdWIgJT4lIA0KICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoImVfcGVhdmVkdWMiKSkgJT4lDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JQ0KICBtdXRhdGUoZXF1YWxfZGlzdHJpYjEwID0gdmRlbXNfc3ViICU+JSANCiAgICAgICAgICAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJ2MnhlZ19lcWRyIikpICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUgIA0KICAgbXV0YXRlKGRpdl9wYXJ0eTEwID0gdmRlbXNfc3ViICU+JSANCiAgICAgICAgICAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJ2MnhfZGl2cGFyY3RybCIpKSAlPiUNCiAgICAgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KICAgICAgICAgICByb3dNZWFucykgJT4lICANCiAgIG11dGF0ZShkaXZfcG93ZXIxMCA9IHZkZW1zX3N1YiAlPiUgDQogICAgICAgICAgIGRjYXN0KGNvdW50cnlfbmFtZSB+IHllYXIsIA0KICAgICAgICAgICAgICAgICB2YWx1ZS52YXI9YygidjJ4X2ZlZHVuaSIpKSAlPiUNCiAgICAgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KICAgICAgICAgICByb3dNZWFucykgJT4lICANCiAgIG11dGF0ZShhY2NvdW50YWJpbGl0eTEwID0gdmRlbXNfc3ViICU+JSANCiAgICAgICAgICAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJ2MnhfYWNjb3VudGFiaWxpdHkiKSkgJT4lDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JSAgICANCiAgIG11dGF0ZShkaXJlY3RkZW0xMCA9IHZkZW1zX3N1YiAlPiUgDQogICAgICAgICAgIGRjYXN0KGNvdW50cnlfbmFtZSB+IHllYXIsIA0KICAgICAgICAgICAgICAgICB2YWx1ZS52YXI9YygidjJ4ZGRfZGQiKSkgJT4lDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JSAgICAgIA0KICAgbXV0YXRlKGVxX2VkdWMxMCA9IHZkZW1zX3N1YiAlPiUgDQogICAgICAgICAgIGRjYXN0KGNvdW50cnlfbmFtZSB+IHllYXIsIA0KICAgICAgICAgICAgICAgICB2YWx1ZS52YXI9YygidjJwZWVkdWVxIikpICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUgICAgICAgDQogICAgbXV0YXRlKGVxX2hlYWx0aDEwID0gdmRlbXNfc3ViICU+JSANCiAgICAgICAgICAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJ2MnBlaGVhbHRoIikpICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUgIA0KICAgICBtdXRhdGUoY29udHJvbGNvcnJ1cHRpb24xMCA9IHZkZW1zX3N1YiAlPiUgDQogICAgICAgICAgIGRjYXN0KGNvdW50cnlfbmFtZSB+IHllYXIsIA0KICAgICAgICAgICAgICAgICB2YWx1ZS52YXI9YygiZV93YmdpX2NjZSIpKSAlPiUNCiAgICAgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KICAgICAgICAgICByb3dNZWFucykgJT4lICANCiAgICAgbXV0YXRlKGVmZjEwID0gdmRlbXNfc3ViICU+JSANCiAgICAgICAgICAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJlX3diZ2lfZ2VlIikpICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUgDQogICAgIG11dGF0ZShzdGFiaWxpdHkxMCA9IHZkZW1zX3N1YiAlPiUgDQogICAgICAgICAgIGRjYXN0KGNvdW50cnlfbmFtZSB+IHllYXIsIA0KICAgICAgICAgICAgICAgICB2YWx1ZS52YXI9YygiZV93YmdpX3BzZSIpKSAlPiUNCiAgICAgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KICAgICAgICAgICByb3dNZWFucykgJT4lICAgDQogICAgIG11dGF0ZSh1bmlmaWVkX2RlbTEwID0gdmRlbXNfc3ViICU+JSANCiAgICAgICAgICAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJlX3Vkc19tZWFuIikpICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUgICAgIA0KICAgICBtdXRhdGUoZ2RwX2dyb3d0aDEwID0gdmRlbXNfc3ViICU+JSANCiAgICAgICAgICAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJlX21pZ2RwZ3JvbG5zIikpICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUgICAgICAgDQogICAgIG11dGF0ZShpbmZsYTEwID0gdmRlbXNfc3ViICU+JSANCiAgICAgICAgICAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJlX21paW5mbGF0IikpICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUgICAgICAgDQogICAgICMgbXV0YXRlKGxpZmVleHAxMCA9IHZkZW1zX3N1YiAlPiUgDQogICAgICMgICAgICAgZGNhc3QoY291bnRyeV9uYW1lIH4geWVhciwgDQogICAgICMgICAgICAgICAgICAgdmFsdWUudmFyPWMoImVfcGVsaWZlZXgiKSkgJT4lDQogICAgICMgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KICAgICAjICAgICAgIHJvd01lYW5zKSAlPiUgICAgICAgIA0KICAgIG11dGF0ZSh1cmJhbnJhdGlvMTAgPSB2ZGVtc19zdWIgJT4lIA0KICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoImVfbWl1cmJhbmkiKSkgJT4lDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JSAgICAgICAgDQogIA0KIyAgbXV0YXRlKGdpbmkxMCA9IHZkZW1zX3N1YiAlPiUgDQojICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiMgICAgICAgICAgICAgICAgIHZhbHVlLnZhcj1jKCJlX3BlZ2luaXdpIikpICU+JQ0KIyAgICAgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KIyAgICAgICAgICAgcm93TWVhbnMpICU+JSANCiAgIyBEdW1teSB2YXJpYWJsZXMNCiAgbXV0YXRlKHBvbF9yb3VuZCA9IHJvdW5kKHBvbGl0eTEwICogMiAtIDEwKSkgJT4lIA0KICBtdXRhdGUocG9saXR5X2RlbWR1bW15ID0gaWZlbHNlKHBvbF9yb3VuZCA+IDUsIDEsIDApKSAlPiUgDQogIG11dGF0ZShwb2xpdHlfYW5vZHVtbXkgPSBpZmVsc2UocG9sX3JvdW5kID49IC01ICYgcG9sX3JvdW5kIDw9IDUsIDEsIDApKSAlPiUgDQogIG11dGF0ZShwb2xpdHlfYXV0b2R1bW15ID0gaWZlbHNlKHBvbF9yb3VuZCA8IC01LCAxLCAwKSkgJT4lIA0KICBtdXRhdGUocmVnaW1lID0gY2FzZV93aGVuKA0KICAgIHBvbGl0eV9hdXRvZHVtbXkgPT0gMSB+ICJhdXRvIiwNCiAgICBwb2xpdHlfYW5vZHVtbXkgPT0gMSB+ICJhbm8iLA0KICAgIHBvbGl0eV9kZW1kdW1teSA9PSAxIH4gImRlbW8iDQogICAgKQ0KICApICU+JQ0KICBtdXRhdGUocmVnaW1lID0gZmFjdG9yKHJlZ2ltZSwgbGV2ZWxzID0gYygiZGVtbyIsICJhbm8iLCAiYXV0byIpKSkgJT4lIA0KICBtdXRhdGUoY250cnkgPSBpZmVsc2Uoc3RyX2RldGVjdChjbnRyeSwgImlldG5hbSIpLCAiVmlldG5hbSIsIGNudHJ5KSkgJT4lICAgDQogIG11dGF0ZShjbnRyeSA9IGNvdW50cnljb2RlKGNudHJ5LCJjb3VudHJ5Lm5hbWUiLCJjb3VudHJ5Lm5hbWUiKSkgJT4lIA0KICBzZWxlY3QoLW4pDQoNCiMgdmRlbSRjbnRyeVs0MF0gPC0gIlZpZXQgTmFtIg0KDQoNCiMgaWZlbHNlKHJvdW5kKHZkZW0kcG9saXR5MTAgKiAyIC0xMCkgPj0gLTUgJiByb3VuZCh2ZGVtJHBvbGl0eTEwICogMiAtMTApIDw9IDUsIDEsIDApDQoNCnRhYmxlKHZkZW0kcmVnaW1lKQ0KcHJpbnQobGV2ZWxzKHZkZW0kcmVnaW1lKSkgDQoNCg0KDQojIERVUkFUSU9OIE9GIFJFR0lNRT8hIGVfZGVtb2NyYWN5X2R1cmF0aW9uDQpgYGANCg0KDQoNCg0KIyMgUW9HDQoNCmBgYHtyfQ0KbG9hZCgiZGF0YS9xb2cuUmRhdGEiKQ0KDQpjb3VudF9uYSA8LSBmdW5jdGlvbih4KSBzdW0oaXMubmEoeCkpDQoNCnFvZzEwIDwtIHFvZyAlPiUgDQogIGZpbHRlcih5ZWFyICVpbiUgMjAwMDoyMDEwKSAlPiUgDQogIG11dGF0ZShjb3VudF9uYSA9IGFwcGx5KC4sIDEsIGNvdW50X25hKSkgJT4lIA0KICBmaWx0ZXIoY291bnRfbmEgPCAyMDUwKSAlPiUgIA0KICBtdXRhdGUoY250cnkgPSBjb3VudHJ5Y29kZShjY29kZWFscCwgImlzbzNjIiwiY291bnRyeS5uYW1lIikpDQoNCnFvZzEwIDwtIHFvZyAlPiUgDQogIGZpbHRlcih5ZWFyICVpbiUgMjAwMDoyMDEwKSAlPiUgDQogIG11dGF0ZShjb3VudF9uYSA9IGFwcGx5KC4sIDEsIGNvdW50X25hKSkgJT4lIA0KICBmaWx0ZXIoY291bnRfbmEgPCAyMDUwKSAlPiUgIA0KICBtdXRhdGUoY250cnkgPSBjb3VudHJ5Y29kZShjY29kZWFscCwgImlzbzNjIiwiY291bnRyeS5uYW1lIikpICU+JSANCiAgZ3JvdXBfYnkoY250cnkpICU+JQ0KICB0YWxseSgpICU+JSANCiAgbXV0YXRlKGV0aG5pYzEwID0gcW9nMTAgJT4lDQogICAgICAgICAgIGRjYXN0KGNudHJ5IH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhciA9IGMoImFsX2V0aG5pYyIpLCANCiAgICAgICAgICBmdW4uYWdncmVnYXRlID0gbWVhbikgJT4lDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JSANCiAgbXV0YXRlKGdkcDEwID0gcW9nMTAgJT4lDQogICAgICAgICAgIGRjYXN0KGNudHJ5IH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhciA9IGMoImdsZV9jZ2RwYyIpLCANCiAgICAgICAgICBmdW4uYWdncmVnYXRlID0gbWVhbikgJT4lDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JSANCiAgbXV0YXRlKGNvcnJ1cHQxMCA9IHFvZzEwICU+JQ0KICAgICAgICAgICBkY2FzdChjbnRyeSB+IHllYXIsIA0KICAgICAgICAgICAgICAgICB2YWx1ZS52YXIgPSBjKCJiY2lfYmNpIiksIA0KICAgICAgICAgIGZ1bi5hZ2dyZWdhdGUgPSBtZWFuKSAlPiUNCiAgICAgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KICAgICAgICAgICByb3dNZWFucykgJT4lIA0KICBtdXRhdGUobGlmZWV4cDEwID0gcW9nMTAgJT4lDQogICAgICAgICAgIGRjYXN0KGNudHJ5IH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhciA9IGMoImlobWVfbGViczAwMDEiKSwgDQogICAgICAgICAgZnVuLmFnZ3JlZ2F0ZSA9IG1lYW4pICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUgDQogIG11dGF0ZShtb3J0aW5mMTAgPSBxb2cxMCAlPiUNCiAgICAgICAgICAgZGNhc3QoY250cnkgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyID0gYygid2RpX21vcnRpbmYiKSwgDQogICAgICAgICAgZnVuLmFnZ3JlZ2F0ZSA9IG1lYW4pICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUgDQogIG11dGF0ZSh1cmJhbnBvcDEwID0gcW9nMTAgJT4lDQogICAgICAgICAgIGRjYXN0KGNudHJ5IH4geWVhciwNCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyID0gYygid2RpX3BvcHVyYiIpLA0KICAgICAgICAgIGZ1bi5hZ2dyZWdhdGUgPSBtZWFuKSAlPiUNCiAgICAgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KICAgICAgICAgICByb3dNZWFucykgJT4lDQogIG11dGF0ZShxb2dwb3AxMCA9IHFvZzEwICU+JQ0KICAgICAgICAgICBkY2FzdChjbnRyeSB+IHllYXIsDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhciA9IGMoInB3dF9wb3AiKSwNCiAgICAgICAgICBmdW4uYWdncmVnYXRlID0gbWVhbikgJT4lDQogICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgICAgICAgICAgcm93TWVhbnMpICU+JSAgDQogICMgbXV0YXRlKHdvcmsxMCA9IHFvZzEwICU+JQ0KICAjICAgICAgICAgIGRjYXN0KGNudHJ5IH4geWVhciwgDQogICMgICAgICAgICAgICAgICAgdmFsdWUudmFyID0gYygid2RpX3VuZW1wIiksIA0KICAjICAgICAgICAgZnVuLmFnZ3JlZ2F0ZSA9IG1lYW4pICU+JQ0KICAjICAgICAgICAgIHNlbGVjdChgMjAwMGA6YDIwMTBgKSAlPiUNCiAgIyAgICAgICAgICByb3dNZWFucykgJT4lIA0KICBtdXRhdGUoZnJhY19lbGl0ZXMxMCA9ICBxb2cxMCAlPiUgZmlsdGVyKHllYXIgJWluJSAyMDA0OjIwMTApICU+JQ0KICAgICAgICAgICBkY2FzdChjbnRyeSB+IHllYXIsIA0KICAgICAgICAgICAgICAgICB2YWx1ZS52YXIgPSBjKCJmZnBfZmUiKSwgDQogICAgICAgICAgZnVuLmFnZ3JlZ2F0ZSA9IG1lYW4pICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDRgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUgDQogIG11dGF0ZShnbG9iMTAgPSBxb2cxMCAlPiUNCiAgICAgICAgICAgZGNhc3QoY250cnkgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyID0gYygiZHJfaWciKSwgDQogICAgICAgICAgZnVuLmFnZ3JlZ2F0ZSA9IG1lYW4pICU+JQ0KICAgICAgICAgICBzZWxlY3QoYDIwMDBgOmAyMDEwYCkgJT4lDQogICAgICAgICAgIHJvd01lYW5zKSAlPiUgDQogIHNlbGVjdCgtbikNCiMgIG11dGF0ZShhbF9ldGhuaWMgPSBhcy5udW1lcmljKGFsX2V0aG5pYykpICU+JSANCiAgDQpxb2cxMA0KDQojIHFvZzEwICU+JQ0KIyAgICMgc2VsZWN0KGNudHJ5LCBjbmFtZSwgY2NvZGVjb3cpICU+JQ0KIyAgIGdyb3VwX2J5KGNudHJ5KSAlPiUNCiMgICBzbGljZSgxKSAlPiUNCiMgICBhcnJhbmdlKGNudHJ5KQ0KIyAjIA0KIyAjIGNvdW50cnljb2RlKCkNCiMgDQojIHFvZyAlPiUgDQojICAgZmlsdGVyKHllYXIgJWluJSAyMDAwOjIwMTApICU+JSANCiMgICBmaWx0ZXIoc3RyX2RldGVjdChjbmFtZSwgIkdlcm1hbnkiKSkgJT4lIA0KIyAgIHNlbGVjdChjbmFtZSwgYWxfZXRobmljLCBnbGVfY2dkcGMpDQojIA0KDQojIA0KIyBxb2cgJT4lDQojICAgZmlsdGVyKHllYXIgJWluJSAyMDAwOjIwMTApICU+JQ0KIyAgIGZpbHRlcihzdHJfZGV0ZWN0KGNuYW1lLCAiVGFpd2FuIikpICU+JQ0KIyANCiMgICBzZWxlY3QoY25hbWUsIHdkaV9saWZleHApDQoNCiMgb3B0aW9ucyhzY2lwZW49OTk5KQ0KDQpgYGANCg0KIyMgR2luaSBDb2VmZmljaWVudA0KDQpgYGB7cn0NCmxvYWQoImRhdGEvc3dpaWQ2XzEucmRhIikNCg0KZ2luaSA8LSBzd2lpZF9zdW1tYXJ5DQoNCmdpbmlfc3ViIDwtIGdpbmkgJT4lIGZpbHRlcih5ZWFyICVpbiUgMjAwMDoyMDEwKQ0KDQpnaW5pICU8PiUgDQogIGZpbHRlcih5ZWFyICVpbiUgMjAwMDoyMDEwKSAlPiUgDQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQ0KICB0YWxseSAlPiUNCiAgbXV0YXRlKGNudHJ5ID0gdW5pcXVlKGNvdW50cnkpKSAlPiUNCiAgI0RDSSBWYXJpYWJsZXMNCiAgbXV0YXRlKGdpbmkxMCA9IGdpbmlfc3ViICU+JQ0KICAgICAgICAgICBkY2FzdChjb3VudHJ5IH4geWVhciwgDQogICAgICAgICAgICAgICAgIHZhbHVlLnZhciA9IGMoImdpbmlfZGlzcCIpKSAlPiUNCiAgICAgICAgICAgc2VsZWN0KGAyMDAwYDpgMjAxMGApICU+JQ0KICAgICAgICAgICByb3dNZWFucykgJT4lIA0KICBtdXRhdGUoY250cnkgPSBjb3VudHJ5Y29kZShjbnRyeSwiY291bnRyeS5uYW1lIiwiY291bnRyeS5uYW1lIikpICU+JSAgDQogIHNlbGVjdChjbnRyeSwgZ2luaTEwKQ0KDQoNCmBgYA0KDQoNCiMjIE1lcmdpbmcgVGltZQ0KDQojIyMgTGV2ZWwgMg0KDQpgYGB7cn0NCmxldmVsMiA8LSBtZXJnZSh4ID0gcW9nMTAsIHkgPSB2ZGVtLCBieSA9ICJjbnRyeSIpICU+JSBtZXJnZShnaW5pLCBieSA9ICJjbnRyeSIpDQoNCmxldmVsMg0KYGBgDQoNCiMjIyBJbmQgKyBDb3VudHJ5DQoNCmBgYHtyfQ0KIyBsb2FkKCJkYXRhL2xldmVsMS5SZGF0YSIpDQoNCmNvbWJpbmVkIDwtIG1lcmdlKHggPSBtZXJnZWQsIHkgPSBsZXZlbDIsIGJ5ID0gImNudHJ5IikgJT4lIA0KICAgICAgICAgICAgICBtdXRhdGUoY250cnllYXJzID0gcGFzdGUoY250cnksIHllYXIpKQ0KDQojY29tYmluZWQkY250cnllYXJzIDwtIHBhc3RlKGNvbWJpbmVkJGNudHJ5LGNvbWJpbmVkJHllYXIpDQoNCg0KdmRlbTIgPC0gdmRlbXNfc3RhcnQgJT4lDQogIGZpbHRlcih5ZWFyICVpbiUgMjAxMDoyMDE1KSAlPiUgDQogIG11dGF0ZShjb3VudHJ5X25hbWUgPSBpZmVsc2Uoc3RyX2RldGVjdChjb3VudHJ5X25hbWUsICJpZXRuYW0iKSwgIlZpZXRuYW0iLCBjb3VudHJ5X25hbWUpKSAlPiUgICANCiAgbXV0YXRlKGNudHJ5ID0gY291bnRyeWNvZGUoY291bnRyeV9uYW1lLCJjb3VudHJ5Lm5hbWUiLCJjb3VudHJ5Lm5hbWUiKSkgIyU+JSANCiAjIHNlbGVjdChjbnRyeSwgY291bnRyeV9uYW1lKQ0KDQojIHZkZW0yJGNudHJ5Wzk5Nl0gPC0gIlZpZXQgTmFtIg0KIyB2ZGVtMiRjbnRyeVs5OTddIDwtICJWaWV0IE5hbSINCiMgdmRlbTIkY250cnlbOTk4XSA8LSAiVmlldCBOYW0iDQojIHZkZW0yJGNudHJ5Wzk5OV0gPC0gIlZpZXQgTmFtIg0KIyB2ZGVtMiRjbnRyeVsxMDAwXSA8LSAiVmlldCBOYW0iDQojIHZkZW0yJGNudHJ5WzEwMDFdIDwtICJWaWV0IE5hbSINCg0KIyB2MnhfZnJlZXhwX3RoaWNrIGZyZWVkb20gb2YgZXhwcmVzc2lvbg0KDQpjb21iaW5lZCA8LSB2ZGVtMiAlPiUgDQogIG11dGF0ZShjbnRyeWVhcnMgPSBwYXN0ZShjbnRyeSwgeWVhcikpICU+JSANCiAgbXV0YXRlKGRpc2N1c3NfdW5zZWwgPSB2MnhjbF9kaXNjKSAlPiUgDQogIHNlbGVjdChjbnRyeWVhcnMsIGRpc2N1c3NfdW5zZWwpICU+JSANCiAgbWVyZ2UoY29tYmluZWQsIGJ5ID0gImNudHJ5ZWFycyIpICU+JSANCiAgICAgICAgICAgICAgICAgIHBseXI6OmRkcGx5KH5jbnRyeSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcmlzZSwgDQogICAgICAgICAgICAgICAgICAgICAgICBkaXNjdXNzID0gbWVhbihkaXNjdXNzX3Vuc2VsLCBuYS5ybT1UKSkgJT4lIA0KICBtZXJnZShjb21iaW5lZCwgYnkgPSAiY250cnkiKQ0KDQoNCg0KDQoNCnNhdmUoY29tYmluZWQsZmlsZSA9ICJkYXRhL2NvbWJpbmVkLlJkYXRhIikNCnNhdmUobGV2ZWwyLGZpbGUgPSAiZGF0YS9sZXZlbDIuUmRhdGEiKQ0KYGBgDQoNCg0KIyBXZWlnaHRpbmcsIFJlbW92ZSBOQXMgYW5kIE5vcm1hbGl6aW5nDQoNCg0KIyMgSW5kaXZpZHVhbCBMZXZlbA0KDQpgYGB7cn0NCmNvbWJpbmVkIDwtIGNvbWJpbmVkICU+JSANCiAgICAgICAgICAgICAgICBtdXRhdGUoZGlzY3Vzc19yb3VuZCA9IHJvdW5kKGRpc2N1c3MqNCkpICU+JSANCiAgICAgICAgICAgICAgICBtdXRhdGUoZ292X3RydXN0X2xvdyA9IGNhc2Vfd2hlbigNCiAgICAgICAgICAgICAgICAgICAgICBkaXNjdXNzX3JvdW5kID09IDIgfiBnb3ZfdHJ1c3QgKiAuOSwNCiAgICAgICAgICAgICAgICAgICAgICBkaXNjdXNzX3JvdW5kID09IDEgfiBnb3ZfdHJ1c3QgKiAuODUsDQogICAgICAgICAgICAgICAgICAgICAgZGlzY3Vzc19yb3VuZCAlaW4lIGMoMyw0KSB+IGdvdl90cnVzdCkpICU+JSANCiAgICAgICAgICAgICAgICBtdXRhdGUoZ292X3RydXN0X2hpZ2ggPSBjYXNlX3doZW4oDQogICAgICAgICAgICAgICAgICAgICAgZGlzY3Vzc19yb3VuZCA9PSAyIH4gZ292X3RydXN0ICogLjgsDQogICAgICAgICAgICAgICAgICAgICAgZGlzY3Vzc19yb3VuZCA9PSAxIH4gZ292X3RydXN0ICogLjc1LA0KICAgICAgICAgICAgICAgICAgICAgIGRpc2N1c3Nfcm91bmQgJWluJSBjKDMsNCkgfiBnb3ZfdHJ1c3QpKSAlPiUgDQogICAgICAgICAgICAgICAgbXV0YXRlKHVyYmFucmF0aW8xMCA9IGlmZWxzZShpcy5uYSh1cmJhbnJhdGlvMTApLCB1cmJhbnBvcDEwLCB1cmJhbnJhdGlvMTApKSAlPiUgDQogICAgICAgICAgICAgICAgbXV0YXRlKHBvcDEwID0gaWZlbHNlKGlzLm5hKHBvcDEwKSwgcW9ncG9wMTAgKiAxMDAwMDAwLCBwb3AxMCkpICU+JSANCiAgICAgICAgICAgICAgICBzZWxlY3QoY250cnksIHllYXIsIGdvdl90cnVzdCwgZ292X3RydXN0X2xvdywgZ292X3RydXN0X2hpZ2gsIGFnZTpFU1MsIGRlbGliMTA6ZW5nYWdlMTAsIHBvbGl0eTEwLA0KICAgICAgICAgICAgICAgICAgICAgICBwb2xfcm91bmQsIHBvbGl0eV9kZW1kdW1teSwgcG9saXR5X2Fub2R1bW15LCBwb2xpdHlfYXV0b2R1bW15LCBwb2xpdHlfYXV0b2R1bW15LA0KICAgICAgICAgICAgICAgICAgICAgICByZWdpbWUsIGRpc2N1c3MsIGRpc2N1c3Nfcm91bmQsIGdkcDEwLCBjb3JydXB0MTAsIGxpZmVleHAxMCwgcG9wMTAsIA0KICAgICAgICAgICAgICAgICAgICAgICBwb2x5MTAsIHJpdzEwLCB1bmlmaWVkX2RlbTEwLCB1cmJhbnJhdGlvMTAsIHdlaWdodCkgJT4lIA0KICBuYS5vbWl0KCkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhnb3ZfdHJ1c3Q6dHJ1c3RfY291cnRzLCB3dnM6cG9saXR5X2F1dG9kdW1teSwgZGlzY3VzcywgZ2RwMTA6dXJiYW5yYXRpbzEwKSwgcmFuZ2UwMSkNCg0KIyBjb21iaW5lZCAlPiUgc2VsZWN0KGNudHJ5KSAlPiUgdW5pcXVlKCkNCg0Kc2F2ZShjb21iaW5lZCwgZmlsZSA9ICJkYXRhL2NvbWJpbmVkLlJkYXRhIikNCg0KYGBgDQoNCg0KIyMgTWFjcm8gTGV2ZWwNCg0KYGBge3J9DQoNCm1hY3JvICA8LSBjb21iaW5lZCAlPiUgDQogICAgICAgICAgICAgICAgIyBtdXRhdGUoZ292X3RydXN0ID0gcmFuZ2UwMShnb3ZfdHJ1c3QpKSAlPiUgDQogICAgICAgICAgICAgICAgIyBtdXRhdGUoZGVtdG9kYXkgPSByYW5nZTAxKGRlbXRvZGF5KSoxMDApICU+JSANCiAgICAgICAgICAgICAgICBncm91cF9ieShjbnRyeSkgJT4lIA0KICAgICAgICAgICAgICAgIGRwbHlyOjpzdW1tYXJpc2UoDQogICAgICAgICAgICAgICAgICBtZWFuX2dvdiA9IG1lYW4oZ292X3RydXN0LCBuYS5ybT1UKSwNCiAgICAgICAgICAgICAgICAgIG1lYW5fZ292X2xvdyA9IG1lYW4oZ292X3RydXN0X2xvdywgbmEucm09VCksDQogICAgICAgICAgICAgICAgICBtZWFuX2dvdl9oaWdoID0gbWVhbihnb3ZfdHJ1c3RfaGlnaCwgbmEucm09VCksDQogICAgICAgICAgICAgICAgICBkaXNjdXNzID0gbWVhbihkaXNjdXNzLCBuYS5ybT1UKSwNCiAgICAgICAgICAgICAgICAgICkgJT4lIA0KICAgICAgICAgICAgICAgIG1lcmdlKGxldmVsMiwgYnkgPSAiY250cnkiKSAlPiUgDQogICAgICAgICAgICAgICAgemFwX2luZigpICU+JSANCiAgICAgICAgICAgICAgICBtdXRhdGUodXJiYW5yYXRpbzEwID0gaWZlbHNlKGlzLm5hKHVyYmFucmF0aW8xMCksIHVyYmFucG9wMTAsIHVyYmFucmF0aW8xMCkpICU+JSANCiAgICAgICAgICAgICAgICBtdXRhdGUocG9wMTAgPSBpZmVsc2UoaXMubmEocG9wMTApLCBxb2dwb3AxMCAqIDEwMDAwMDAsIHBvcDEwKSkgJT4lIA0KICAgICAgICAgICAgICAgIHNlbGVjdChjbnRyeSwgbWVhbl9nb3YsIG1lYW5fZ292X2xvdywgbWVhbl9nb3ZfaGlnaCwgDQogICAgICAgICAgICAgICAgICAgICAgIGRlbGliMTA6cG9saXR5MTAsIA0KICAgICAgICAgICAgICAgICAgICAgICBwb2xfcm91bmQsIHBvbGl0eV9kZW1kdW1teSwgcG9saXR5X2Fub2R1bW15LCANCiAgICAgICAgICAgICAgICAgICAgICAgcG9saXR5X2F1dG9kdW1teSwgcG9saXR5X2F1dG9kdW1teSwNCiAgICAgICAgICAgICAgICAgICAgICAgcmVnaW1lLCBkaXNjdXNzLCAjZGlzY3Vzc19yb3VuZCwgDQogICAgICAgICAgICAgICAgICAgICAgIGdkcDEwLCBjb3JydXB0MTAsIGxpZmVleHAxMCwgcG9wMTAsIA0KICAgICAgICAgICAgICAgICAgICAgICBwb2x5MTAsIHJpdzEwLCB1bmlmaWVkX2RlbTEwLCB1cmJhbnJhdGlvMTApICU+JSANCiAgICAgICAgICAgICAgICBkcm9wX25hKG1lYW5fZ292KSAlPiUgDQogICAgICAgICAgICAgICAgbXV0YXRlKGNvdW50X25hID0gYXBwbHkoLiwgMSwgY291bnRfbmEpKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGRlbGliMTA6cG9saXR5MTAsIHBvbGl0eV9kZW1kdW1teTpwb2xpdHlfYXV0b2R1bW15LCBkaXNjdXNzOnVyYmFucmF0aW8xMCksIHJhbmdlMDEpDQoNCm1hY3JvX2RlbSA8LSBtYWNybyAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKHBvbGl0eV9kZW1kdW1teSA9PSAxKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGRlbGliMTA6cG9saXR5MTAsIHBvbGl0eV9kZW1kdW1teTpwb2xpdHlfYXV0b2R1bW15LCBkaXNjdXNzOnVyYmFucmF0aW8xMCksIHJhbmdlMDEpDQoNCm1hY3JvX2F1dCA8LSBtYWNybyAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKHBvbGl0eV9kZW1kdW1teSA9PSAwKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGRlbGliMTA6cG9saXR5MTAsIHBvbGl0eV9kZW1kdW1teTpwb2xpdHlfYXV0b2R1bW15LCBkaXNjdXNzOnVyYmFucmF0aW8xMCksIHJhbmdlMDEpDQoNCiMgdGFibGVfc3R1ZmYyPC1zdWJzZXQodGFibGVfc3R1ZmYsDQojICAgICAgICAgICAgICAgICAgICAgICFpcy5uYSh0YWJsZV9zdHVmZiRyZWdpbWUpICYNCiMgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZV9zdHVmZiRjbnRyeSE9IlFhdGFyIiAmDQojICAgICAgICAgICAgICAgICAgICAgICB0YWJsZV9zdHVmZiRjbnRyeSE9IlV6YmVraXN0YW4iKQ0KDQoNCg0Kc2F2ZShtYWNybywgZmlsZSA9ICJkYXRhL21hY3JvLlJkYXRhIikNCnNhdmUobWFjcm9fZGVtLCBmaWxlID0gImRhdGEvbWFjcm9fZGVtLlJkYXRhIikNCnNhdmUobWFjcm9fYXV0LCBmaWxlID0gImRhdGEvbWFjcm9fYXV0LlJkYXRhIikNCg0KYGBgDQoNCg0KIyBDcmFwDQoNCiMjIFNFTSBJbmRleA0KDQpgYGB7cn0NCm1lcmdlZDIgPC0gbWVyZ2VkICU+JQ0KICBtdXRhdGUoZ292X3RydXN0ID0gdHJ1c3RfZ292ICsgdHJ1c3RfcGFybGlhbWVudCArIA0KICAgICAgICAgICB0cnVzdF9wb2xpY2UgKyB0cnVzdF9jb3VydHMpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKGdvdl90cnVzdCkpDQoNCm1lcmdlZDMgPC0gbWVyZ2VkICU+JQ0KICBtdXRhdGUoZ292X3RydXN0ID0gdHJ1c3RfZ292ICsgdHJ1c3RfcGFybGlhbWVudCArIA0KICAgICAgICAgICB0cnVzdF9wb2xpY2UgKyB0cnVzdF9jb3VydHMpICU+JQ0KICBmaWx0ZXIoaXMubmEoZ292X3RydXN0KSkNCg0Kc3Z5LmRmIDwtIHN1cnZleTo6c3Z5ZGVzaWduKGlkPSB+MSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodHM9IH53ZWlnaHQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPSBtZXJnZWQpIA0KDQptb2RlbCA8LSAnIyBtZWFzdXJlbWVudCBtb2RlbCAxDQpnb3ZfdHJ1c3QyID1+IDEqdHJ1c3RfZ292ICsgdHJ1c3RfcGFybGlhbWVudCArIA0KdHJ1c3RfcG9saWNlICsgdHJ1c3RfY291cnRzDQp0cnVzdF9nb3Ygfn4gdHJ1c3RfcGFybGlhbWVudA0KJw0KDQptZXJnZWQgPC0gbWVyZ2VkICU+JQ0KICBtdXRhdGVfYXQodmFycyh0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsDQogICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSwgdHJ1c3RfY291cnRzKSwgYXMubnVtZXJpYykNCg0KIyBjb3IobmEub21pdChkYXRhLmZyYW1lKG1lcmdlZCR0cnVzdF9nb3YsDQojICAgICAgICAgICAgICAgbWVyZ2VkJHRydXN0X3BvbGljZSwNCiMgICAgICAgICAgICAgICBtZXJnZWQkdHJ1c3RfY291cnRzLA0KIyAgICAgICAgICAgICAgIG1lcmdlZCR0cnVzdF9wYXJsaWFtZW50LA0KIyAgICAgICAgICAgICAgIG1lcmdlZCRkZW10b2RheSkpKQ0KDQpsYXZhYW5fbW9kZWwxPC1jZmEobW9kZWwsIG1lYW5zdHJ1Y3R1cmUgPSBULCANCiAgICAgICAgICAgICAgICAgICBkYXRhID0gYXMuZGF0YS5mcmFtZShtZXJnZWQpLA0KICAgICAgICAgICAgICAgICAgIGVzdGltYXRvcj0gIk1MTSIpDQoNCmZpdF9hMTwtbGF2YWFuLnN1cnZleShsYXZhYW5fbW9kZWwxLCANCiAgICAgICAgICAgIGVzdGltYXRvcj0gIk1MTSIsIHN1cnZleS5kZXNpZ249c3Z5LmRmKQ0Kc3VtbWFyeShmaXRfYTEsIHN0YW5kYXJkaXplZD1UUlVFLGZpdC5tZWFzdXJlcyA9IFRSVUUsIHJzcSA9IFQpDQoNCm1lcmdlZDQ8LWNiaW5kKG1lcmdlZDIsIHByZWRpY3QoZml0X2ExLCBuZXdkYXRhID0gbWVyZ2VkMikpDQptZXJnZWQ0JGdvdl90cnVzdDI8LXJhbmdlMDEobWVyZ2VkNCRnb3ZfdHJ1c3QyKQ0KDQojIGhlYWQobWVyZ2VkNCkNCg0KbWVyZ2VkPC1wbHlyOjpyYmluZC5maWxsKG1lcmdlZDMsbWVyZ2VkNCkNCm1lcmdlZCRnb3ZfdHJ1c3Q8LW1lcmdlZCRnb3ZfdHJ1c3QyDQpoZWFkKG1lcmdlZCkNCmBgYA0KDQpgYGB7cn0NCg0KY29tcGFyZV9jbnRyeTwtZGF0YS5mcmFtZSh0YWJsZShtZXJnZWQkY250cnksbWVyZ2VkJHllYXIpKQ0KY29tcGFyZV9jbnRyeTwtdGlkeXI6OnNwcmVhZChjb21wYXJlX2NudHJ5LFZhcjIsRnJlcSkNCmNvbXBhcmVfY250cnlbY29tcGFyZV9jbnRyeT09MF08LTEwMDAwMA0KI2NvbXBhcmVfY250cnk8LW5hLm9taXQoY29tcGFyZV9jbnRyeSkNCmluZGllPC1hcy5udW1lcmljKGFwcGx5KGNvbXBhcmVfY250cnlbLC0xXSwxLHN1bSkpDQpjb21wYXJlX2NudHJ5JGRvdWJsZTwtaW5kaWU8OTAwMDAwDQpjb21wYXJlX2NudHJ5W2NvbXBhcmVfY250cnk9PTEwMDAwMF08LTANCmNvbXBhcmVfY250cnkyIDwtIHN1YnNldChjb21wYXJlX2NudHJ5LGNvbXBhcmVfY250cnkkZG91YmxlPT1UUlVFKQ0KDQpjb21wYXJlX2NudHJ5MyA8LSBzdWJzZXQobWVyZ2VkLG1lcmdlZCRjbnRyeSAlaW4lIGNvbXBhcmVfY250cnkyJFZhcjEpDQoNCnkxPC1zdWJzZXQoY29tcGFyZV9jbnRyeTMsY29tcGFyZV9jbnRyeTMkY250cnk9PSJCZWxpemUiICYNCiAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlX2NudHJ5MyR5ZWFyPT0yMDEyKSRnb3ZfdHJ1c3QNCg0KeTI8LXN1YnNldChjb21wYXJlX2NudHJ5Myxjb21wYXJlX2NudHJ5MyRjbnRyeT09IkJlbGl6ZSIgJg0KICAgICAgICAgY29tcGFyZV9jbnRyeTMkeWVhcj09MjAxNCkkZ292X3RydXN0DQoNCnQudGVzdCh5MSx5MikNCg0KeTE8LXN1YnNldChjb21wYXJlX2NudHJ5Myxjb21wYXJlX2NudHJ5MyRjbnRyeT09IkJvbGl2aWEgKFBsdXJpbmF0aW9uYWwgU3RhdGUgb2YpIiAmDQogICAgICAgICAgICAgY29tcGFyZV9jbnRyeTMkeWVhcj09MjAxMikkZ292X3RydXN0DQoNCnkyPC1zdWJzZXQoY29tcGFyZV9jbnRyeTMsY29tcGFyZV9jbnRyeTMkY250cnk9PSJCb2xpdmlhIChQbHVyaW5hdGlvbmFsIFN0YXRlIG9mKSIgJg0KICAgICAgICAgICAgIGNvbXBhcmVfY250cnkzJHllYXI9PTIwMTMpJGdvdl90cnVzdA0KDQp0LnRlc3QoeTEseTIpDQoNCnkxPC1zdWJzZXQoY29tcGFyZV9jbnRyeTMsY29tcGFyZV9jbnRyeTMkY250cnk9PSJTb3V0aCBBZnJpY2EiICYNCiAgICAgICAgICAgICBjb21wYXJlX2NudHJ5MyR5ZWFyPT0yMDExKSRnb3ZfdHJ1c3QNCg0KeTI8LXN1YnNldChjb21wYXJlX2NudHJ5Myxjb21wYXJlX2NudHJ5MyRjbnRyeT09IlNvdXRoIEFmcmljYSIgJg0KICAgICAgICAgICAgIGNvbXBhcmVfY250cnkzJHllYXI9PTIwMTMpJGdvdl90cnVzdA0KDQp0LnRlc3QoeTEseTIpDQoNCiAgICAgICANCnN1YnNldChtZXJnZWQsbWVyZ2VkJHllYXI9PTIwMTIpDQoNCmxpYnJhcnkoZHBseXIpDQpjb21wYXJlX2NudHJ5NCA8LSBjb21wYXJlX2NudHJ5MyAlPiUNCiAgZ3JvdXBfYnkoY250cnkseWVhcikgJT4lDQogIHN1bW1hcmlzZV9hbGwoZnVucyhtZWFuKC4sIG5hLnJtPVRSVUUpKSkNCg0KY29tcGFyZV9jbnRyeTQkY250cnllYXI8LXBhc3RlKGNvbXBhcmVfY250cnk0JGNudHJ5LGNvbXBhcmVfY250cnk0JHllYXIpDQogIA0KYXMuZGF0YS5mcmFtZShjb21wYXJlX2NudHJ5NFssYygxNyw4KV0pDQogIA0KP2RkcGx5DQpoZWFkKGFmcm8pDQoNCmFmcm9jbnRyeTwtdW5pcXVlKGFmcm8kY250cnkpDQpsYXRpbm9jbnRyeTwtdW5pcXVlKGxhdGlubzIwMTMkY250cnkpDQphcmFiY250cnk8LXVuaXF1ZShhcmFiMyRjbnRyeSkNCnd2c2NudHJ5PC11bmlxdWUod3ZzJGNudHJ5KQ0KDQpjbnRyeV90YWJsZTwtIGRhdGEuZnJhbWUoYXMuY2hhcmFjdGVyKHd2c2NudHJ5KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBjKGFzLmNoYXJhY3RlcihhcmFiY250cnkpLHJlcCgiLSIsNDgpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBjKGFzLmNoYXJhY3RlcihsYXRpbm9jbnRyeSkscmVwKCItIiw0MSkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGMoYXMuY2hhcmFjdGVyKGFmcm9jbnRyeSkscmVwKCItIiwyNCkpKQ0KDQpjb2xuYW1lcyhjbnRyeV90YWJsZSkgPC0gYygid3ZzIiwiYXJhYiIsImxhdGlubyIsImFmcm8iKQ0KDQphcnJhbmdlKGNudHJ5X3RhYmxlLCB3dnMsIGFmcm8pDQoNCg0KDQp0YWJsZShjb21iaW5lZCRwb2xpdGNhdC54KQ0KbXBsdXNkYXRhIDwtIGNvbWJpbmVkICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5LCBkZWxpYjEwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdF9nb3YsIHRydXN0X3BhcmxpYW1lbnQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0X3BvbGljZSx0cnVzdF9jb3VydHMsd2VpZ2h0KQ0KbXBsdXNkYXRhIDwtIG5hLm9taXQobXBsdXNkYXRhKQ0KbXBsdXNkYXRhJGNudHJ5IDwtIGFzLm51bWVyaWMobXBsdXNkYXRhJGNudHJ5KQ0Kd3JpdGVfY3N2KG1wbHVzZGF0YSwgcGF0aCA9ICJtcGx1c2RhdGEuY3N2IiwgY29sX25hbWVzID0gRikNCg0KbXBsdXNkYXRhMiA8LSBjb21iaW5lZCAlPiUgZHBseXI6OnNlbGVjdChjbnRyeSwgZGVsaWIxMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ292X3RydXN0LHdlaWdodCkNCm1wbHVzZGF0YTIgPC0gbmEub21pdChtcGx1c2RhdGEyKQ0KbXBsdXNkYXRhMiRjbnRyeSA8LSBhcy5udW1lcmljKG1wbHVzZGF0YTIkY250cnkpDQp3cml0ZV9jc3YobXBsdXNkYXRhMiwgcGF0aCA9ICJtcGx1c2RhdDJhLmNzdiIsIGNvbF9uYW1lcyA9IEYpDQoNCm1wbHVzZGF0YTJfZGVtIDwtIGNvbWJpbmVkX2RlbSAlPiUgZHBseXI6OnNlbGVjdChjbnRyeSwgZGVsaWIxMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdl90cnVzdCx3ZWlnaHQpDQptcGx1c2RhdGEyX2RlbSA8LSBuYS5vbWl0KG1wbHVzZGF0YTJfZGVtKQ0KbXBsdXNkYXRhMl9kZW0kY250cnkgPC0gYXMubnVtZXJpYyhtcGx1c2RhdGEyX2RlbSRjbnRyeSkNCndyaXRlX2NzdihtcGx1c2RhdGEyX2RlbSwgcGF0aCA9ICJtcGx1c2RhdDJfZGVtYS5jc3YiLCBjb2xfbmFtZXMgPSBGKQ0KDQptcGx1c2RhdGEyX2F1dCA8LSBjb21iaW5lZF9hdXQgJT4lIGRwbHlyOjpzZWxlY3QoY250cnksIGRlbGliMTAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3ZfdHJ1c3Qsd2VpZ2h0KQ0KbXBsdXNkYXRhMl9hdXQgPC0gbmEub21pdChtcGx1c2RhdGEyX2F1dCkNCm1wbHVzZGF0YTJfYXV0JGNudHJ5IDwtIGFzLm51bWVyaWMobXBsdXNkYXRhMl9hdXQkY250cnkpDQp3cml0ZV9jc3YobXBsdXNkYXRhMl9hdXQsIHBhdGggPSAibXBsdXNkYXQyX2F1dGEuY3N2IiwgY29sX25hbWVzID0gRikNCg0KY29tYmluZWQgPC0gbWVyZ2UoY29tYmluZWQsIHBoeXNpMl9zLCBieSA9ICJjbnRyeSIpDQoNCmNvbWJpbmVkX2RlbSA8LSBzdWJzZXQoY29tYmluZWQsY29tYmluZWQkcG9saXR5X2RlbWR1bW15PT0xKQ0KDQptcGx1c2RhdGFfZGVtIDwtIGNvbWJpbmVkX2RlbSAlPiUgZHBseXI6OnNlbGVjdChjbnRyeSwgZGVsaWIxMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1c3RfZ292LCB0cnVzdF9wYXJsaWFtZW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsdHJ1c3RfY291cnRzLHdlaWdodCkNCm1wbHVzZGF0YV9kZW0gPC0gbmEub21pdChtcGx1c2RhdGFfZGVtKQ0KbXBsdXNkYXRhX2RlbSRjbnRyeSA8LSBhcy5udW1lcmljKG1wbHVzZGF0YV9kZW0kY250cnkpDQp3cml0ZV9jc3YobXBsdXNkYXRhX2RlbSwgcGF0aCA9ICJtcGx1c2RhdGFfZGVtLmNzdiIsIGNvbF9uYW1lcyA9IEYpDQoNCg0KY29tYmluZWRfYXV0IDwtIHN1YnNldChjb21iaW5lZCxjb21iaW5lZCRwb2xpdHlfZGVtZHVtbXk9PTApDQoNCm1wbHVzZGF0YV9hdXQgPC0gY29tYmluZWRfYXV0ICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5LCBkZWxpYjEwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0X2dvdiwgdHJ1c3RfcGFybGlhbWVudCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdF9wb2xpY2UsdHJ1c3RfY291cnRzLHdlaWdodCkNCm1wbHVzZGF0YV9hdXQgPC0gbmEub21pdChtcGx1c2RhdGFfYXV0KQ0KbXBsdXNkYXRhX2F1dCRjbnRyeSA8LSBhcy5udW1lcmljKG1wbHVzZGF0YV9hdXQkY250cnkpDQp3cml0ZV9jc3YobXBsdXNkYXRhX2F1dCwgcGF0aCA9ICJtcGx1c2RhdGFfYXV0LmNzdiIsIGNvbF9uYW1lcyA9IEYpDQoNCg0KI2RhdGFfd2lkcyA8LSBkY2FzdChtZXJnZWQsIGNudHJ5fnllYXIsIA0KIyAgICAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoInllYXIiKSkNCiNkYXRhX3dpZHMyIDwtIGFzLmRhdGEuZnJhbWUobGFwcGx5KGRhdGFfd2lkc1ssLTFdLGZ1bmN0aW9uKG4pIDA8bikpDQojZGF0YV93aWRzMyA8LSBhcy5kYXRhLmZyYW1lKGFwcGx5KGRhdGFfd2lkczIsMixhcy5udW1lcmljKSkNCiNkYXRhX3dpZHMzIDwtIGNiaW5kKGRhdGFfd2lkc1ssMV0sZGF0YV93aWRzMykNCiNuYW1lcyhkYXRhX3dpZHMzKVsxXTwtImNudHJ5Ig0KI3RhYmxlX3N0dWZmIDwtIG1lcmdlKGRhdGFfd2lkczMgLHRhYmxlX3N0dWZmLCBieT0iY250cnkiKQ0KDQojdGFibGVfc3R1ZmYkcG9saXR5MTBbdGFibGVfc3R1ZmYkY250cnk9PSJUdW5pc2lhIl0gPC0gNS4zMjM4Mg0KI3RhYmxlX3N0dWZmMiRwb2xpdHkxMFt0YWJsZV9zdHVmZjIkY250cnk9PSJUdW5pc2lhIl0gPC0gNS4zMjM4Mg0KDQpoZWFkKHRhYmxlX3N0dWZmKQ0KY29yKG5hLm9taXQoZGF0YS5mcmFtZSh0YWJsZV9zdHVmZiRsZWdpdCx0YWJsZV9zdHVmZiRsZWdpdDIsdGFibGVfc3R1ZmYkbGVnaXQzLA0KICAgICAgICAgICAgICAgICAgICAgICB0YWJsZV9zdHVmZiRtZWFuX2dvdikpKQ0KDQp0YWJsZV9zdHVmZiRnbmkgPC0gdGFibGVfc3R1ZmYkZ25pX2MNCg0KdGFibGVfc3R1ZmYkZ25pX2NbdGFibGVfc3R1ZmYkZ25pIDw9IDEwMjVdIDwtICJsb3ciDQp0YWJsZV9zdHVmZiRnbmlfY1t0YWJsZV9zdHVmZiRnbmkgPiAxMDI2ICYgdGFibGVfc3R1ZmYkZ25pIDw9IDQwMzVdIDwtICJsb3dlci1taWRkbGUiDQp0YWJsZV9zdHVmZiRnbmlfY1t0YWJsZV9zdHVmZiRnbmkgPiA0MDM2ICYgdGFibGVfc3R1ZmYkZ25pIDw9IDEyNDc1XSA8LSAidXBwZXItbWlkZGxlIg0KdGFibGVfc3R1ZmYkZ25pX2NbdGFibGVfc3R1ZmYkZ25pID4gMTI0NzVdIDwtICJoaWdoIg0KDQp0YWJsZV9zdHVmZiRnbmlfYzIgPC0gdGFibGVfc3R1ZmYkZ25pX2MNCg0KdGFibGVfc3R1ZmYkZ25pX2MyW3RhYmxlX3N0dWZmJGduaV9jID09ICJsb3dlci1taWRkbGUiXSA8LSAibG93Ig0KdGFibGVfc3R1ZmYkZ25pX2MyW3RhYmxlX3N0dWZmJGduaV9jID09ICJ1cHBlci1taWRkbGUiXSA8LSAiaGlnaCINCg0KdGFibGUodGFibGVfc3R1ZmYkZ25pX2MpDQp0YWJsZSh0YWJsZV9zdHVmZiRnbmlfYzIpDQoNClRoZSBjdXQtb2ZmIHBvaW50cyBhcmUgSERJIG9mIGxlc3MgdGhhbiAwLjU1MA0KZm9yIGxvdyBodW1hbiBkZXZlbG9wbWVudCwgMC41NTAtMC42OTkgZm9yIG1lZGl1bSBodW1hbg0KZGV2ZWxvcG1lbnQsIDAuNzAwLTAuNzk5IGZvciBoaWdoIGh1bWFuIGRldmVsb3BtZW50IGFuZA0KMC44MDAgb3IgZ3JlYXRlciBmb3IgdmVyeSBoaWdoIGh1bWFuIGRldmVsb3BtZW50Lg0KDQojdGFibGVfc3R1ZmYkaGRpX2MgPC0gdGFibGVfc3R1ZmYkaGRpDQoNCiN0YWJsZV9zdHVmZiRoZGlfY1t0YWJsZV9zdHVmZiRoZGkgPCAwLjU1MF0gPC0gImxvdyINCiN0YWJsZV9zdHVmZiRoZGlfY1t0YWJsZV9zdHVmZiRoZGkgPj0gMC41NTAgJiB0YWJsZV9zdHVmZiRoZGkgPD0gMC42OTldIDwtICJtZWRpdW0iDQojdGFibGVfc3R1ZmYkaGRpX2NbdGFibGVfc3R1ZmYkaGRpID49IDAuNzAwICYgdGFibGVfc3R1ZmYkaGRpIDw9IDAuODk5XSA8LSAiaGlnaCINCiN0YWJsZV9zdHVmZiRoZGlfY1t0YWJsZV9zdHVmZiRoZGkgPj0gMC45MF0gPC0gInZlcnkgaGlnaCINCg0KI3RhYmxlKHRhYmxlX3N0dWZmJGhkaV9jKQ0KDQoNCg0KdGFibGUocm91bmQodGFibGVfc3R1ZmYkdGVycm9yKSkNCg0KdGFibGVfc3R1ZmYkbWVhbl9nb3YyIDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292DQp0YWJsZV9zdHVmZiRtZWFuX2dvdjJbaXMubmEodGFibGVfc3R1ZmYkbWVhbl9nb3YyKV08LTk5OQ0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjMgPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3YNCnRhYmxlX3N0dWZmJG1lYW5fZ292M1tpcy5uYSh0YWJsZV9zdHVmZiRtZWFuX2dvdjMpXTwtOTk5DQoNCnRhYmxlX3N0dWZmJG1lYW5fZ292NCA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdg0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y0W2lzLm5hKHRhYmxlX3N0dWZmJG1lYW5fZ292NCldPC05OTkNCg0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y1IDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292DQp0YWJsZV9zdHVmZiRtZWFuX2dvdjVbaXMubmEodGFibGVfc3R1ZmYkbWVhbl9nb3Y1KV08LTk5OQ0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjYgPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3YNCnRhYmxlX3N0dWZmJG1lYW5fZ292Nltpcy5uYSh0YWJsZV9zdHVmZiRtZWFuX2dvdjYpXTwtOTk5DQoNCnRhYmxlX3N0dWZmJG1lYW5fZ292NyA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdg0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y3W2lzLm5hKHRhYmxlX3N0dWZmJG1lYW5fZ292NyldPC05OTkNCg0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y4IDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292DQp0YWJsZV9zdHVmZiRtZWFuX2dvdjhbaXMubmEodGFibGVfc3R1ZmYkbWVhbl9nb3Y4KV08LTk5OQ0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjkgPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3YNCnRhYmxlX3N0dWZmJG1lYW5fZ292OVtpcy5uYSh0YWJsZV9zdHVmZiRtZWFuX2dvdjkpXTwtOTk5DQoNCnRhYmxlX3N0dWZmJHBoeXN2aW9sMiA8LSB0YWJsZV9zdHVmZiRwaHlzdmlvbA0KdGFibGVfc3R1ZmYkcGh5c3Zpb2wyW2lzLm5hKHRhYmxlX3N0dWZmJHBoeXN2aW9sMildIDwtIDk5OQ0KDQp0YWJsZV9zdHVmZiR0ZXJyb3IyIDwtIHJvdW5kKHRhYmxlX3N0dWZmJHRlcnJvcikNCnRhYmxlX3N0dWZmJHRlcnJvcjJbaXMubmFuKHRhYmxlX3N0dWZmJHRlcnJvcjIpXSA8LSA5OTkNCg0KdGFibGVfc3R1ZmYkZGlzY3VzczIgPC0gcm91bmQodGFibGVfc3R1ZmYkZGlzY3Vzcyo0KQ0KdGFibGVfc3R1ZmYkZGlzY3VzczJbaXMubmFuKHRhYmxlX3N0dWZmJGRpc2N1c3MyKV0gPC0gOTk5DQoNCg0KDQp0YWJsZSh0YWJsZV9zdHVmZiRwaHlzdmlvbCkNCnRhYmxlX3N0dWZmJG1lYW5fZ292Mlt0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuNSAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj4wLjRdIDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292Mlt0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuNSAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj4wLjRdLTUNCnRhYmxlX3N0dWZmJG1lYW5fZ292Mlt0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuNCAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj4wLjNdIDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292Mlt0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuNCAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj4wLjNdLTEwDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjJbdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPD0wLjMgJiB0YWJsZV9zdHVmZiRwaHlzdmlvbDI+MC4yXSA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdjJbdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPD0wLjMgJiB0YWJsZV9zdHVmZiRwaHlzdmlvbDI+MC4yXS0xNQ0KdGFibGVfc3R1ZmYkbWVhbl9nb3YyW3RhYmxlX3N0dWZmJHBoeXN2aW9sMjw9MC4yICYgdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPjAuMV0gPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3YyW3RhYmxlX3N0dWZmJHBoeXN2aW9sMjw9MC4yICYgdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPjAuMV0tMjANCnRhYmxlX3N0dWZmJG1lYW5fZ292Mlt0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuMSAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj49MF0gIDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292Mlt0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuMSAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj49MF0gIC0yNQ0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjJbdGFibGVfc3R1ZmYkbWVhbl9nb3YyPjEwMF0gPC0gTkENCnRhYmxlKHRhYmxlX3N0dWZmJG1lYW5fZ292MikNCg0KdGFibGVfc3R1ZmYkbWVhbl9nb3YzW3RhYmxlX3N0dWZmJHBoeXN2aW9sMjw9MC41ICYgdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPjAuNF0gPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3YzW3RhYmxlX3N0dWZmJHBoeXN2aW9sMjw9MC41ICYgdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPjAuNF0tOA0KdGFibGVfc3R1ZmYkbWVhbl9nb3YzW3RhYmxlX3N0dWZmJHBoeXN2aW9sMjw9MC40ICYgdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPjAuM10gPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3YzW3RhYmxlX3N0dWZmJHBoeXN2aW9sMjw9MC40ICYgdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPjAuM10tMTYNCnRhYmxlX3N0dWZmJG1lYW5fZ292M1t0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuMyAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj4wLjJdIDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292M1t0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuMyAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj4wLjJdLTI0DQp0YWJsZV9zdHVmZiRtZWFuX2dvdjNbdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPD0wLjIgJiB0YWJsZV9zdHVmZiRwaHlzdmlvbDI+MC4xXSA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdjNbdGFibGVfc3R1ZmYkcGh5c3Zpb2wyPD0wLjIgJiB0YWJsZV9zdHVmZiRwaHlzdmlvbDI+MC4xXSAtMzINCnRhYmxlX3N0dWZmJG1lYW5fZ292M1t0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuMSAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj49MF0gPC0gIHRhYmxlX3N0dWZmJG1lYW5fZ292M1t0YWJsZV9zdHVmZiRwaHlzdmlvbDI8PTAuMSAmIHRhYmxlX3N0dWZmJHBoeXN2aW9sMj49MF0gIC0zMA0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjNbdGFibGVfc3R1ZmYkbWVhbl9nb3YzPjEwMF0gPC0gTkENCnRhYmxlKHRhYmxlX3N0dWZmJG1lYW5fZ292MykNCg0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y0W3RhYmxlX3N0dWZmJHRlcnJvcjI9PTVdIDwtIHRhYmxlX3N0dWZmJG1lYW5fZ292NFt0YWJsZV9zdHVmZiR0ZXJyb3IyPT01XS01DQp0YWJsZV9zdHVmZiRtZWFuX2dvdjRbdGFibGVfc3R1ZmYkdGVycm9yMj09NF0gPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3Y0W3RhYmxlX3N0dWZmJHRlcnJvcjI9PTRdLTEwDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjRbdGFibGVfc3R1ZmYkdGVycm9yMj09M10gPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3Y0W3RhYmxlX3N0dWZmJHRlcnJvcjI9PTNdLTE1DQoNCnRhYmxlX3N0dWZmJG1lYW5fZ292NFt0YWJsZV9zdHVmZiRtZWFuX2dvdjQ+MTAwXSA8LSBOQQ0KdGFibGUodGFibGVfc3R1ZmYkbWVhbl9nb3Y0KQ0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjVbdGFibGVfc3R1ZmYkdGVycm9yMj09NV0gPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3Y1W3RhYmxlX3N0dWZmJHRlcnJvcjI9PTVdLTgNCnRhYmxlX3N0dWZmJG1lYW5fZ292NVt0YWJsZV9zdHVmZiR0ZXJyb3IyPT00XSA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdjVbdGFibGVfc3R1ZmYkdGVycm9yMj09NF0tMTYNCnRhYmxlX3N0dWZmJG1lYW5fZ292NVt0YWJsZV9zdHVmZiR0ZXJyb3IyPT0zXSA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdjVbdGFibGVfc3R1ZmYkdGVycm9yMj09M10tMjQNCg0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y1W3RhYmxlX3N0dWZmJG1lYW5fZ292NT4xMDBdIDwtIE5BDQp0YWJsZSh0YWJsZV9zdHVmZiRtZWFuX2dvdjUpDQoNCnRhYmxlX3N0dWZmJG1lYW5fZ292Nlt0YWJsZV9zdHVmZiRkaXNjdXNzMj09Ml0gPC0gdGFibGVfc3R1ZmYkbWVhbl9nb3Y2W3RhYmxlX3N0dWZmJGRpc2N1c3MyPT0yXSAtNQ0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y2W3RhYmxlX3N0dWZmJGRpc2N1c3MyPT0xXSA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdjZbdGFibGVfc3R1ZmYkZGlzY3VzczI9PTFdIC0xMA0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjZbdGFibGVfc3R1ZmYkbWVhbl9nb3Y2PjEwMF0gPC0gTkENCnRhYmxlKHRhYmxlX3N0dWZmJG1lYW5fZ292NikNCg0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y3W3RhYmxlX3N0dWZmJGRpc2N1c3MyPT0yXSA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdjdbdGFibGVfc3R1ZmYkZGlzY3VzczI9PTJdIC0xMA0KdGFibGVfc3R1ZmYkbWVhbl9nb3Y3W3RhYmxlX3N0dWZmJGRpc2N1c3MyPT0xXSA8LSB0YWJsZV9zdHVmZiRtZWFuX2dvdjdbdGFibGVfc3R1ZmYkZGlzY3VzczI9PTFdIC0yMA0KDQp0YWJsZV9zdHVmZiRtZWFuX2dvdjdbdGFibGVfc3R1ZmYkbWVhbl9nb3Y3PjEwMF0gPC0gTkENCnRhYmxlKHRhYmxlX3N0dWZmJG1lYW5fZ292NykNCg0KDQpsb2FkKHFvZ191cmwpDQoNCnFvZzEwIDwtIHN1YnNldChxb2cscW9nJHllYXI9PTIwMDAgfA0KICAgICAgICAgICAgICAgICAgcW9nJHllYXI9PTIwMDEgfCAgDQogICAgICAgICAgICAgICAgICBxb2ckeWVhcj09MjAwMiB8IA0KICAgICAgICAgICAgICAgICAgcW9nJHllYXI9PTIwMDMgfCANCiAgICAgICAgICAgICAgICAgIHFvZyR5ZWFyPT0yMDA0IHwgDQogICAgICAgICAgICAgICAgICBxb2ckeWVhcj09MjAwNSB8IA0KICAgICAgICAgICAgICAgICAgcW9nJHllYXI9PTIwMDYgfCANCiAgICAgICAgICAgICAgICAgIHFvZyR5ZWFyPT0yMDA3IHwgDQogICAgICAgICAgICAgICAgICBxb2ckeWVhcj09MjAwOCB8IA0KICAgICAgICAgICAgICAgICAgcW9nJHllYXI9PTIwMDkgfA0KICAgICAgICAgICAgICAgICAgcW9nJHllYXI9PTIwMTApDQoNCmxpYnJhcnkoY291bnRyeWNvZGUpDQpxb2cxMCRjbnRyeTwtY291bnRyeWNvZGUocW9nMTAkY2NvZGVjb3csICJjb3duIiwiY291bnRyeS5uYW1lIikNCnFvZzEwJGFsX2V0aG5pYzwtYXMubnVtZXJpYyhxb2cxMCRhbF9ldGhuaWMpDQojdGlkeXI6OmdhdGhlcihxb2cxMCxjKCJjbnRyeSIsInllYXIiKSwiYWxfZXRobmljIikNCg0KcW9nMTBhIDwtIHFvZzEwICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5LHllYXIsYWxfZXRobmljKSAlPiUNCiAgYXMuZGF0YS5mcmFtZSgpDQpkYXRhX3dpZGUxNyA8LSByZXNoYXBlKGRhdGEgPSBxb2cxMGEsDQogICAgICAgICAgICAgICAgICAgICAgIGlkdmFyID0gImNudHJ5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgdi5uYW1lcyA9ICJhbF9ldGhuaWMiLA0KICAgICAgICAgICAgICAgICAgICAgICB0aW1ldmFyID0gInllYXIiLA0KICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAid2lkZSIpDQoNCiNxb2cxMGhkaSA8LSBxb2cxMCAlPiUgZHBseXI6OnNlbGVjdChjbnRyeSx5ZWFyLHVuZHBfaGRpKSAlPiUNCiMgIGFzLmRhdGEuZnJhbWUoKQ0KI2RhdGFfd2lkZV9oZGkgPC0gaGRpDQogICNyZXNoYXBlKGRhdGEgPSBxb2cxMGhkaSwNCiAgICAgICAgICAgICAgICAgICAgICAjIGlkdmFyID0gImNudHJ5IiwNCiAgICAgICAgICAgICAgICAgICAgICAjIHYubmFtZXMgPSAidW5kcF9oZGkiLA0KICAgICAgICAgICAgICAgICAgICAgICMgdGltZXZhciA9ICJ5ZWFyIiwNCiAgICAgICAgICAgICAgICAgICAgICAjIGRpcmVjdGlvbiA9ICJ3aWRlIikNCg0KDQoNCnRhYmxlKHFvZyRhbF9ldGhuaWMscW9nJHllYXIpDQoNCnFvZzE0IDwtIHN1YnNldChxb2cscW9nJHllYXI9PTIwMTQpDQpxb2cxNCRjbnRyeTwtY291bnRyeWNvZGUocW9nMTQkY2NvZGVjb3csICJjb3duIiwiY291bnRyeS5uYW1lIikNCnFvZzE0IDwtIHFvZzE0ICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5LHllYXIsY3NwZl9sZWdpdCkgJT4lDQogIGFzLmRhdGEuZnJhbWUoKQ0KZGF0YV93aWRlMTggPC0gcmVzaGFwZShkYXRhID0gcW9nMTQsDQogICAgICAgICAgICAgICAgICAgICAgIGlkdmFyID0gImNudHJ5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgdi5uYW1lcyA9ICJjc3BmX2xlZ2l0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgdGltZXZhciA9ICJ5ZWFyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gIndpZGUiKQ0KDQpxb2cxNSA8LSBzdWJzZXQocW9nLHFvZyR5ZWFyPT0yMDE1KQ0KcW9nMTUkY250cnk8LWNvdW50cnljb2RlKHFvZzE1JGNjb2RlY293LCAiY293biIsImNvdW50cnkubmFtZSIpDQpxb2cxNSA8LSBxb2cxNSAlPiUgZHBseXI6OnNlbGVjdChjbnRyeSx5ZWFyLGZmcF9zbCkgJT4lDQogIGFzLmRhdGEuZnJhbWUoKQ0KZGF0YV93aWRlMTkgPC0gcmVzaGFwZShkYXRhID0gcW9nMTUsDQogICAgICAgICAgICAgICAgICAgICAgIGlkdmFyID0gImNudHJ5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgdi5uYW1lcyA9ICJmZnBfc2wiLA0KICAgICAgICAgICAgICAgICAgICAgICB0aW1ldmFyID0gInllYXIiLA0KICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAid2lkZSIpDQoNCg0KcW9nMTAkY2lyaV9waHlzaW50PC1hcy5udW1lcmljKHFvZzEwJGNpcmlfcGh5c2ludCkNCnFvZzEwYSA8LSBxb2cxMCAlPiUgZHBseXI6OnNlbGVjdChjbnRyeSx5ZWFyLGNpcmlfcGh5c2ludCkgJT4lDQogIGFzLmRhdGEuZnJhbWUoKQ0KZGF0YV93aWRlMjAgPC0gcmVzaGFwZShkYXRhID0gcW9nMTBhLA0KICAgICAgICAgICAgICAgICAgICAgICBpZHZhciA9ICJjbnRyeSIsDQogICAgICAgICAgICAgICAgICAgICAgIHYubmFtZXMgPSAiY2lyaV9waHlzaW50IiwNCiAgICAgICAgICAgICAgICAgICAgICAgdGltZXZhciA9ICJ5ZWFyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gIndpZGUiKQ0KDQpxb2cxMCRnZF9wdHNzIDwtYXMubnVtZXJpYyhxb2cxMCRnZF9wdHNzKQ0KcW9nMTBhIDwtIHFvZzEwICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5LHllYXIsZ2RfcHRzcykgJT4lDQogIGFzLmRhdGEuZnJhbWUoKQ0KZGF0YV93aWRlMjEgPC0gcmVzaGFwZShkYXRhID0gcW9nMTBhLA0KICAgICAgICAgICAgICAgICAgICAgICBpZHZhciA9ICJjbnRyeSIsDQogICAgICAgICAgICAgICAgICAgICAgIHYubmFtZXMgPSAiZ2RfcHRzcyIsDQogICAgICAgICAgICAgICAgICAgICAgIHRpbWV2YXIgPSAieWVhciIsDQogICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJ3aWRlIikNCg0KcW9nMTQ8LXN1YnNldChxb2cscW9nJHllYXI9PTIwMTQpDQpxb2cxMzwtc3Vic2V0KHFvZyxxb2ckeWVhcj09MjAxMykNCnFvZzEyPC1zdWJzZXQocW9nLHFvZyR5ZWFyPT0yMDEyKQ0KcW9nMTE8LXN1YnNldChxb2cscW9nJHllYXI9PTIwMTEpDQpxb2cxMDwtc3Vic2V0KHFvZyxxb2ckeWVhcj09MjAxMCkNCnFvZzg8LXN1YnNldChxb2cscW9nJHllYXI9PTIwMDgpDQpxb2c3PC1zdWJzZXQocW9nLHFvZyR5ZWFyPT0yMDA3KQ0KcW9nNjwtc3Vic2V0KHFvZyxxb2ckeWVhcj09MjAwNikNCnFvZzU8LXN1YnNldChxb2cscW9nJHllYXI9PTIwMDUpDQpxb2c0PC1zdWJzZXQocW9nLHFvZyR5ZWFyPT0yMDA0KQ0KcW9nMzwtc3Vic2V0KHFvZyxxb2ckeWVhcj09MjAwMykNCnFvZzI8LXN1YnNldChxb2cscW9nJHllYXI9PTIwMDIpDQpxb2cxPC1zdWJzZXQocW9nLHFvZyR5ZWFyPT0yMDAxKQ0KcW9nMDwtc3Vic2V0KHFvZyxxb2ckeWVhcj09MjAwMCkNCg0KDQoNCnRhYmxlKGlzLm5hKHFvZyR3ZWxfY3VsdHVyZSkscW9nJHllYXIpDQpjdWxyZWc8LSBwbWF4KHFvZzE0JHdlbF9jdWx0dXJlLCBxb2cxMyR3ZWxfY3VsdHVyZSwgbmEucm0gPSBUUlVFKQ0KY3VscmVnPC0gcG1heChjdWxyZWcsIHFvZzEyJHdlbF9jdWx0dXJlLCBuYS5ybSA9IFRSVUUpDQpjdWxyZWc8LSBwbWF4KGN1bHJlZywgcW9nMTEkd2VsX2N1bHR1cmUsIG5hLnJtID0gVFJVRSkNCmN1bHJlZzwtIHBtYXgoY3VscmVnLCBxb2cxMCR3ZWxfY3VsdHVyZSwgbmEucm0gPSBUUlVFKQ0KY3VscmVnPC0gcG1heChjdWxyZWcsIHFvZzgkd2VsX2N1bHR1cmUsIG5hLnJtID0gVFJVRSkNCmN1bHJlZzwtIHBtYXgoY3VscmVnLCBxb2c3JHdlbF9jdWx0dXJlLCBuYS5ybSA9IFRSVUUpDQpjdWxyZWc8LSBwbWF4KGN1bHJlZywgcW9nNiR3ZWxfY3VsdHVyZSwgbmEucm0gPSBUUlVFKQ0KY3VscmVnPC0gcG1heChjdWxyZWcsIHFvZzUkd2VsX2N1bHR1cmUsIG5hLnJtID0gVFJVRSkNCmN1bHJlZzwtIHBtYXgoY3VscmVnLCBxb2c0JHdlbF9jdWx0dXJlLCBuYS5ybSA9IFRSVUUpDQpjdWxyZWc8LSBwbWF4KGN1bHJlZywgcW9nMyR3ZWxfY3VsdHVyZSwgbmEucm0gPSBUUlVFKQ0KY3VscmVnPC0gcG1heChjdWxyZWcsIHFvZzIkd2VsX2N1bHR1cmUsIG5hLnJtID0gVFJVRSkNCmN1bHJlZzwtIHBtYXgoY3VscmVnLCBxb2cxJHdlbF9jdWx0dXJlLCBuYS5ybSA9IFRSVUUpDQpjdWxyZWc8LSBwbWF4KGN1bHJlZywgcW9nMCR3ZWxfY3VsdHVyZSwgbmEucm0gPSBUUlVFKQ0KY3VscmVnPC0gYXMuY2hhcmFjdGVyKHNqbWlzYzo6dG9fbGFiZWwoY3VscmVnKSkNCmN1bHJlZzwtYXMuZGF0YS5mcmFtZShjYmluZChjdWxyZWcscW9nMTQkY2NvZGVjb3cpKQ0Kb3JlYXN0ICA8LSBzdWJzZXQoY3VscmVnLCBjdWxyZWckY3VscmVnID09ICJPcnRob2RveCBFYXN0IikNCm9yZWFzdA0KDQojY3VscmVnPC0gcG1heChjdWxyZWcsIHFvZzEwJHdlbF9jdWx0dXJlLCBuYS5ybSA9IFRSVUUpDQoNCnFvZzE0JGh0X3JlZ2lvbiANCg0KY3VscmVnJGNudHJ5PC1jb3VudHJ5Y29kZShjdWxyZWckVjIsICJjb3duIiwiY291bnRyeS5uYW1lIikNCnRhYmVsZXR0bzwtbWVyZ2UodGFibGVfc3R1ZmYsY3VscmVnLGJ5PSJjbnRyeSIpDQp0YWJlbGV0dG88LWFzLmRhdGEuZnJhbWUoY2JpbmQodGFibGVfc3R1ZmYkcmVnaW9ucywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIodGFibGVfc3R1ZmYkY250cnkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3Rlcih0YWJlbGV0dG8kY3VscmVnKSkpDQp0YWJlbGV0dG8gPC0gdGFiZWxldHRvW29yZGVyKHRhYmVsZXR0byRWMSwgdGFiZWxldHRvJFYzKSxdDQojZWRpdCh0YWJlbGV0dG8pDQoNCmN1bHJlZzwtZGF0YS5mcmFtZShjYmluZCh0YWJlbGV0dG8sY3VscmVnKSkNCmN1bHJlZzwtY3VscmVnWyxjKDIsNCldDQpuYW1lcyhjdWxyZWcpWzFdPC1jKCJjbnRyeSIpDQoNCnRhYmxlX3N0dWZmMyA8LSBtZXJnZSh0YWJsZV9zdHVmZixjdWxyZWcsYnk9ImNudHJ5IikNCg0KdGFibGUoYXMuY2hhcmFjdGVyKHRhYmVsZXR0byRWMykpDQoNCnFvZzEwMCA8LSBzdWJzZXQocW9nLHFvZyR5ZWFyPT0yMDEwKQ0KcW9nMTAwJGNudHJ5PC1jb3VudHJ5Y29kZShzam1pc2M6OnRvX2xhYmVsKHFvZzEwMCRjY29kZWNvdyksICJjb3duIiwiY291bnRyeS5uYW1lIikNCnFvZzEwMCA8LSBxb2cxMDAgJT4lIGRwbHlyOjpzZWxlY3QoY250cnkseWVhcixodF9yZWd0eXBlMSkgJT4lDQogIGFzLmRhdGEuZnJhbWUoKQ0KcW9nMTAwJHJlZ3R5cGU8LXNqbWlzYzo6dG9fbGFiZWwocW9nMTAwJGh0X3JlZ3R5cGUxKQ0KcW9nMTAwJHllYXIgPC0gTlVMTA0KcW9nMTAwJGh0X3JlZ3R5cGUxIDwtIE5VTEwNCnRhYmxlKHFvZzEwMCRyZWd0eXBlKQ0KDQoNCmV0aG5pYzEwPC1hcy5udW1lcmljKHJvd01lYW5zKGRhdGFfd2lkZTE3WywyOjEyXSkpICMgbWVhbiBvdmVyIGxhc3QgMTAgeWVhcnMgKDIwMDAgLSAyMDEwKQ0KcGh5c2ludDEwPC1hcy5udW1lcmljKHJvd01lYW5zKGRhdGFfd2lkZTIwWywyOjEyXSkpICMgbWVhbiBvdmVyIGxhc3QgMTAgeWVhcnMgKDIwMDAgLSAyMDEwKQ0KdGVycm9yMTA8LWFzLm51bWVyaWMocm93TWVhbnMoZGF0YV93aWRlMjFbLDI6MTJdKSkgIyBtZWFuIG92ZXIgbGFzdCAxMCB5ZWFycyAoMjAwMCAtIDIwMTApDQpsZWdpdDwtYXMubnVtZXJpYyhkYXRhX3dpZGUxOFssMl0pICMgbWVhbiBvdmVyIGxhc3QgMTAgeWVhcnMgKDIwMDAgLSAyMDEwKQ0KbGVnaXQyPC1hcy5udW1lcmljKGRhdGFfd2lkZTE5WywyXSkgIyBtZWFuIG92ZXIgbGFzdCAxMCB5ZWFycyAoMjAwMCAtIDIwMTApDQpxb2d0aGluZ3k8LWRhdGEuZnJhbWUoZGF0YV93aWRlMTlbLDFdLGV0aG5pYzEwLGxlZ2l0LGxlZ2l0MixwaHlzaW50MTAsdGVycm9yMTApDQpjb2xuYW1lcyhxb2d0aGluZ3kpWzFdPC1jKCJjbnRyeSIpDQpxb2d0aGluZ3k8LW1lcmdlKHg9cW9ndGhpbmd5LCB5PXFvZzEwMCwgYnk9ImNudHJ5IikNCg0KI3FvZ3RoaW5neTwtZGF0YS5mcmFtZShkYXRhX3dpZGUxN1ssMV0sZXRobmljMTApDQojY29sbmFtZXMocW9ndGhpbmd5KVsxXTwtYygiY250cnkiKQ0KI2NvbWJpbmVkIDwtIG1lcmdlKHg9cW9ndGhpbmd5LCB5PWNvbWJpbmVkLCBieT0iY250cnkiKQ0KDQoNCnFvZ19jcyA8LXJlYWRfc3BzcygiQzovVXNlcnMvRmF2b25lL0Rvd25sb2Fkcy9xb2dfc3RkX2NzX2phbjE3LnNhdiIpICNsb2FkaW5nIGRhdGFzZXQNCnFvZ19jcyRjbnRyeTwtY291bnRyeWNvZGUocW9nX2NzJGNjb2RlY293LCAiY293biIsImNvdW50cnkubmFtZSIpDQpxb2dfY3MkbGVnaXQzPC1hcy5udW1lcmljKHFvZ19jcyRnb3ZfaXhsZWdpdGltYWN5aW5kZXgpDQoNCmxlZ2l0X2RhdDwtZGF0YS5mcmFtZShxb2dfY3MkY250cnkscW9nX2NzJGxlZ2l0MykNCmNvbG5hbWVzKGxlZ2l0X2RhdCk8LWMoImNudHJ5IiwibGVnaXQzIikNCg0KYWdncmRlbGliIDwtIG1lcmdlKHg9bGVnaXRfZGF0LCB5PWFnZ3JkZWxpYiwgYnk9ImNudHJ5IikNCg0KYWdncmRlbGliJGxlZ2l0MyA8LSByYW5nZTAxKGFnZ3JkZWxpYiRsZWdpdDMpDQpjb3IobmEub21pdChhZ2dyZGVsaWJbLGMoNCw1LDcsMTMpXSkpDQpjb3IobmEub21pdChhZ2dyZGVsaWJbLGMoNCw1LDIsNjoxMyldKSkNCg0KYWdncmRlbGliJGxlZ2l0IDwtIDEtcmFuZ2UwMShhZ2dyZGVsaWIkbGVnaXQpDQphZ2dyZGVsaWIkbGVnaXQyIDwtIDEtcmFuZ2UwMShhZ2dyZGVsaWIkbGVnaXQyKQ0KYWdncmRlbGliJGFzaWEgPC0gYWdncmRlbGliJGUuYXNpYSArIGFnZ3JkZWxpYiRzLmUuYXNpYSArIGFnZ3JkZWxpYiRzLmFzaWEgKyBhZ2dyZGVsaWIkcGFjaWZpYw0KDQpTRkkgPC1yZWFkX3Nwc3MoIkM6L1VzZXJzL0Zhdm9uZS9Eb3dubG9hZHMvU0ZJdjIwMTYuc2F2IikgI2xvYWRpbmcgZGF0YXNldA0KU0ZJIDwtIHN1YnNldChTRkksU0ZJJHllYXI9PTIwMTUpDQpTRkkkY250cnkgPC1jb3VudHJ5Y29kZShTRkkkY291bnRyeSwgImNvdW50cnkubmFtZSIsImNvdW50cnkubmFtZSIpIA0KU0ZJJGNudHJ5Wzc5XSA8LSAiTm9ydGggS29yZWEiDQpTRkkkY250cnkgPC1jb3VudHJ5Y29kZShTRkkkY250cnksICJjb3VudHJ5Lm5hbWUiLCJjb3VudHJ5Lm5hbWUiKSANClNGSSRsZWdpdGltYWN5IDwtIFNGSSRsZWdpdA0KU0ZJJGxlZ2l0IDwtIE5VTEwNCg0KDQphZ2dyZGVsaWIgPC0gbWVyZ2UoeD1TRkksIHk9YWdncmRlbGliLCBieT0iY250cnkiKQ0KDQpoZGkgPC0gcmVhZF9jc3YoImhkaS5jc3YiKQ0KaGRpJGNudHJ5PC1jb3VudHJ5Y29kZShoZGkkQ291bnRyeSwgImNvdW50cnkubmFtZSIsImNvdW50cnkubmFtZSIpDQpoZGkkJzE5OTAnPC0gTlVMTCA7IGhkaSQnMTk5MSc8LSBOVUxMIDsgaGRpJCcxOTkyJzwtIE5VTEwgOyBoZGkkJzE5OTMnPC0gTlVMTA0KaGRpJCcxOTk0JzwtIE5VTEw7IGhkaSQnMTk5NSc8LSBOVUxMOyBoZGkkJzE5OTYnPC0gTlVMTDsgaGRpJCcxOTk3JzwtIE5VTEwNCmhkaSQnMTk5OCc8LSBOVUxMIDsgaGRpJCcxOTk5JzwtIE5VTEwgOyBoZGkkJzIwMTEnPC0gTlVMTCA7IGhkaSQnMjAxMic8LSBOVUxMDQpoZGkkJzIwMTMnPC0gTlVMTDsgaGRpJCcyMDE0JzwtIE5VTEw7IGhkaSQnMjAxNSc8LSBOVUxMO2hkaSRgSERJIFJhbmsgKDIwMTUpYDwtIE5VTEwNCmhkaSRDb3VudHJ5PC0gTlVMTA0KaGRpMTA8LWFzLm51bWVyaWMocm93TWVhbnMoaGRpWywxOjExXSkpIA0KaGRhdDwtZGF0YS5mcmFtZShoZGkkY250cnksaGRpMTApIA0KbmFtZXMoaGRhdCk8LWMoImNudHJ5IiwiaGRpMTAiKQ0KDQphZ2dyZGVsaWIgPC0gbWVyZ2UoeD1oZGF0LCB5PWFnZ3JkZWxpYiwgYnk9ImNudHJ5IikNCiN0YWJsZShhZ2dyZGVsaWIkaGRpMTApDQojZ2MoKQ0KI2NvbWJpbmVkIDwtIG1lcmdlKHg9aGRhdCwgeT1jb21iaW5lZCwgYnk9ImNudHJ5IikNCg0KDQojY29sbmFtZXMoYWdncmRlbGliKVs5XTwtImVfcF9wb2xpdHkiDQojbG9wPC1zdWJzZXQodmRlbXNfc3RhcnQsdmRlbXNfc3RhcnQkeWVhcj09MjAxMCkNCg0KY29yKG5hLm9taXQoYWdncmRlbGliMlssMjoxN10pKQ0KY29yKG5hLm9taXQoZGF0YS5mcmFtZShhZ2dyZGVsaWIkcG9saXR5MTAsYWdncmRlbGliJGRlbGliMTApKSkNCg0KI2hpc3QodmRlbXMkdjJkbGNvbnNsdCkNCiNoaXN0KHZkZW1zJHYyeGNsX2Rpc2MpDQojdGFibGUodmRlbXNfc3RhcnQkZV9ib2l4X3JlZ2ltZSx2ZGVtc19zdGFydCR5ZWFyKQ0KI3RhYmxlKHZkZW1zX3N1YiRlX3BfcG9saXR5LHZkZW1zX3N1YiR5ZWFyKQ0KDQojIyMjIyBtZXJnaW5nIHRpbWUgIyMjIw0KDQpjb21iaW5lZCA8LSBtZXJnZSh4PW1lcmdlZCwgeT1hZ2dyZGVsaWIsIGJ5PSJjbnRyeSIpDQp0YWJsZShjb21iaW5lZCRjbnRyeSkNCg0KY29tYmluZWQgPC0gYXMuZGF0YS5mcmFtZShjb21iaW5lZCkNCmNvbWJpbmVkJGdvdl90cnVzdCA8LSBhcy5udW1lcmljKGNvbWJpbmVkJGdvdl90cnVzdCkNCmNvbWJpbmVkJGFnZSA8LSBhcy5udW1lcmljKGNvbWJpbmVkJGFnZSkNCmNvbWJpbmVkJGluY29tZSA8LSBhcy5udW1lcmljKGNvbWJpbmVkJGluY29tZSkNCmNvbWJpbmVkJGVkdWMgPC0gYXMubnVtZXJpYyhjb21iaW5lZCRlZHVjKQ0KY29tYmluZWQkc2V4IDwtIGFzLmZhY3Rvcihjb21iaW5lZCRzZXgpDQpjb21iaW5lZCRhdXRob3JpdGFyaWFuIDwtIGFzLm51bWVyaWMoY29tYmluZWQkYXV0aG9yaXRhcmlhbikNCmNvbWJpbmVkJHNhZmV0eSA8LSBhcy5udW1lcmljKGNvbWJpbmVkJHNhZmV0eSkNCiMgY29tYmluZWQkZGVtdG9kYXkgPC0gYXMubnVtZXJpYyhjb21iaW5lZCRkZW10b2RheSkNCmNvbWJpbmVkJGxhdGlubyA8LSBmYWN0b3IoY29tYmluZWQkbGF0aW5vKQ0KY29tYmluZWQkYWZybyA8LSBmYWN0b3IoY29tYmluZWQkYWZybykNCmNvbWJpbmVkJGFtZXJpY2FzIDwtIGZhY3Rvcihjb21iaW5lZCRhbWVyaWNhcykNCmNvbWJpbmVkJGFzaWEgPC0gY29tYmluZWQkZS5hc2lhICsgY29tYmluZWQkcy5lLmFzaWEgKyBjb21iaW5lZCRzLmFzaWEgKyBjb21iaW5lZCRwYWNpZmljDQoNCmNvcihuYS5vbWl0KGRhdGEuZnJhbWUoY29tYmluZWQkZ292X3RydXN0LGNvbWJpbmVkJGluY29tZSxjb21iaW5lZCRlZHVjLCAjU29jaW9lY29ub21pYyBmYWN0b3JzDQogICAgICAgICAgICAgICAgICAgICAgIGNvbWJpbmVkJGRlbGliMTAsIGNvbWJpbmVkJHBvbGl0eTEwLCBjb21iaW5lZCRnZHAxMCkpKQ0KDQpjb21iaW5lZCRjbnRyeTwtYXMuZmFjdG9yKGNvbWJpbmVkJGNudHJ5KQ0KDQoNCiNjb21iaW5lZCRwb2xpdHkxMCA8LSBjb21iaW5lZCRwb2xpdHkxMCoyMC0xMA0KDQojY29tYmluZWQkcmVnaW1lIDwtIGNvbWJpbmVkJHBvbGl0eTEwDQojY29tYmluZWQkcmVnaW1lW2NvbWJpbmVkJHBvbGl0eV9hdXRvZHVtbXk9PTFdIDwtICJhdXRvIg0KI2NvbWJpbmVkJHJlZ2ltZVtjb21iaW5lZCRwb2xpdHlfYW5vZHVtbXk9PTFdIDwtICJhbm8iDQojY29tYmluZWQkcmVnaW1lW2NvbWJpbmVkJHBvbGl0eV9kZW1kdW1teT09MV0gPC0gImRlbW8iDQoNCmhpc3QoY29tYmluZWQkZ292X3RydXN0KQ0KcXBsb3QoY29tYmluZWQkZ292X3RydXN0KQ0KDQpjb21iaW5lZCRjbnRyeQ0KDQoNCg0KI3BoeXNpX3MgPC0gdmRlbXNfc3ViMiAlPiUgZHBseXI6OnNlbGVjdChjbnRyeWVhcnMsIGZyYW56KQ0KDQojY29tYmluZWQgPC0gbWVyZ2UoY29tYmluZWQsIHBoeXNpX3MsIGJ5ID0gImNudHJ5ZWFycyIpDQoNCiNwaHlzaTJfcyA8LSBkZHBseShjb21iaW5lZCx+Y250cnksDQojICAgICAgICAgICAgICAgIHN1bW1hcmlzZSxwb2xpdGNhdD1tZWFuKGZyYW56LG5hLnJtPVQpKQ0KDQojY29tYmluZWQgPC0gbWVyZ2UoY29tYmluZWQsIHBoeXNpMl9zLCBieSA9ICJjbnRyeSIpDQoNCg0KdmRlbXNfc3ViMiRjbnRyeWVhcnMgPC0gcGFzdGUodmRlbXNfc3ViMiRjbnRyeSx2ZGVtc19zdWIyJHllYXIpDQoNCnBoeXNpIDwtIHZkZW1zX3N1YjIgJT4lIGRwbHlyOjpzZWxlY3QoY250cnllYXJzLCBwZXJjKQ0KDQpjb21iaW5lZCA8LSBtZXJnZShjb21iaW5lZCwgcGh5c2ksIGJ5ID0gImNudHJ5ZWFycyIpDQoNCnBoeXNpMiA8LSBkZHBseShjb21iaW5lZCx+Y250cnksDQogICAgICAgICAgICAgICAgICAgICBzdW1tYXJpc2UscGh5c3Zpb2w9bWVhbihwZXJjLG5hLnJtPVQpKQ0KDQpjb21iaW5lZCA8LSBtZXJnZShjb21iaW5lZCwgcGh5c2kyLCBieSA9ICJjbnRyeSIpDQoNCg0KDQoNCg0KI3BoeXNpXzIyJGRpczMgPC1yb3VuZChwaHlzaV8yMiRkaXMyKQ0KDQojdW5pcXVlKHBoeXNpMl9zJGNudHJ5KQ0KDQojMS0yLjUNCiMzLTUNCiM1LjUgLSA3DQojcGh5c2kyX3MkcG9saXRjYXQyPC04LSgocGh5c2kyX3MkcG9saXRjYXQpICogKDcvMTApKQ0KIzExIA0KDQojcGh5c2kyX3MkcG9saXR5X2RlbWR1bW15IDwtIHBoeXNpMl9zJHBvbGl0Y2F0Mg0KI3BoeXNpMl9zJHBvbGl0eV9kZW1kdW1teSBbcGh5c2kyX3MkcG9saXRjYXQyIDw9IDIuNV0gPC0gMQ0KI3BoeXNpMl9zJHBvbGl0eV9kZW1kdW1teSBbcGh5c2kyX3MkcG9saXRjYXQyID4gIDIuNV0gPC0gMA0KI3RhYmxlKHBoeXNpMl9zJHBvbGl0eV9kZW1kdW1teSkNCg0KI3BoeXNpMl9zJHBvbGl0eV9hbm9kdW1teSA8LSBwaHlzaTJfcyRwb2xpdGNhdDINCiNwaHlzaTJfcyRwb2xpdHlfYW5vZHVtbXlbcGh5c2kyX3MkcG9saXRjYXQyID4gMi41ICYgcGh5c2kyX3MkcG9saXRjYXQyIDwgNS41XSA8LSAxDQojcGh5c2kyX3MkcG9saXR5X2Fub2R1bW15W3BoeXNpMl9zJHBvbGl0Y2F0MiA8PSAyLjUgfCBwaHlzaTJfcyRwb2xpdGNhdDIgPj0gNS41XSA8LSAwDQojdGFibGUocGh5c2kyX3MkcG9saXR5X2Fub2R1bW15KQ0KDQojcGh5c2kyX3MkcG9saXR5X2F1dG9kdW1teSA8LSBwaHlzaTJfcyRwb2xpdGNhdDINCiNwaHlzaTJfcyRwb2xpdHlfYXV0b2R1bW15W3BoeXNpMl9zJHBvbGl0Y2F0MiA+PSA1LjVdIDwtIDENCiNwaHlzaTJfcyRwb2xpdHlfYXV0b2R1bW15W3BoeXNpMl9zJHBvbGl0Y2F0MiA8IDUuNV0gPC0gMA0KI3RhYmxlKHBoeXNpMl9zJHBvbGl0eV9hdXRvZHVtbXkpDQoNCiNwaHlzaTJfcyRyZWdpbWUgPC0gcGh5c2kyX3MkcG9saXRjYXQNCiNwaHlzaTJfcyRyZWdpbWVbcGh5c2kyX3MkcG9saXR5X2F1dG9kdW1teT09MV0gPC0gImF1dG8iDQojcGh5c2kyX3MkcmVnaW1lW3BoeXNpMl9zJHBvbGl0eV9hbm9kdW1teT09MV0gPC0gImFubyINCiNwaHlzaTJfcyRyZWdpbWVbcGh5c2kyX3MkcG9saXR5X2RlbWR1bW15PT0xXSA8LSAiZGVtbyINCg0KI3VuaXF1ZShwaHlzaTJfcyRjbnRyeSkNCg0KdGFibGUocGh5c2kyX3MkcmVnaW1lKQ0KDQpxb2cyMDAwIDwtIHN1YnNldChxb2cscW9nJHllYXI9PTIwMTAgfA0KICAgICAgICAgICAgICAgICAgICAgICBxb2ckeWVhcj09MjAxMSB8ICANCiAgICAgICAgICAgICAgICAgICAgICAgcW9nJHllYXI9PTIwMTIgfCANCiAgICAgICAgICAgICAgICAgICAgICAgcW9nJHllYXI9PTIwMTMgfCANCiAgICAgICAgICAgICAgICAgICAgICAgcW9nJHllYXI9PTIwMTQgfCANCiAgICAgICAgICAgICAgICAgICAgICAgcW9nJHllYXI9PTIwMTUpDQoNCnRhYmxlKHFvZzIwMDAkZ2RfcHRzYSxxb2cyMDAwJHllYXIpDQoNCnFvZzIwMDAkcGVyYzIgPC0gcW9nMjAwMCRnZF9wdHNhDQoNCnFvZzIwMDAkY250cnk8LWNvdW50cnljb2RlKHFvZzIwMDAkY2NvZGVjb3csICJjb3duIiwiY291bnRyeS5uYW1lIikNCg0KcW9nMjAwMCRjbnRyeWVhcnMgPC0gcGFzdGUocW9nMjAwMCRjbnRyeSxxb2cyMDAwJHllYXIpDQoNCnBoeXNpMjAwMCA8LSBxb2cyMDAwICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5ZWFycywgcGVyYzIpDQoNCmNvbWJpbmVkIDwtIG1lcmdlKGNvbWJpbmVkLCBwaHlzaTIwMDAsIGJ5ID0gImNudHJ5ZWFycyIpDQoNCnBoeXNpMjIwMDAgPC0gZGRwbHkoY29tYmluZWQsfmNudHJ5LA0KICAgICAgICAgICAgICAgIHN1bW1hcmlzZSx0ZXJyb3I9bWVhbihwZXJjMixuYS5ybT1UKSkNCg0KY29tYmluZWQgPC0gbWVyZ2UoY29tYmluZWQsIHBoeXNpMjIwMDAsIGJ5ID0gImNudHJ5IikNCg0KI3RhYmxlKHFvZzIwMDAkdW5kcF9oZGkscW9nMjAwMCR5ZWFyKQ0KDQojcGh5c2lmZiA8LSBxb2cyMDAwICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5ZWFycywgdW5kcF9oZGkpDQoNCiNjb21iaW5lZCA8LSBtZXJnZShjb21iaW5lZCwgcGh5c2lmZiwgYnkgPSAiY250cnllYXJzIikNCg0KI3BoeXNpZmYyIDwtIGRkcGx5KGNvbWJpbmVkLH5jbnRyeSwNCiMgICAgICAgICAgICAgICAgICAgIHN1bW1hcmlzZSxoZGk9bWVhbih1bmRwX2hkaSxuYS5ybT1UKSkNCg0KI2NvbWJpbmVkIDwtIG1lcmdlKGNvbWJpbmVkLCBwaHlzaWZmMiwgYnkgPSAiY250cnkiKQ0KDQoNCmduaSA8LSByZWFkX2NzdigiR05JLmNzdiIsICBza2lwID0gMSkNCg0KZ25pJGAyMDE1YDwtZ3N1YigidHR0IiwiIixnbmkkYDIwMTVgKQ0KZ25pJGAyMDE1YDwtZ3N1YigiZmYiLCIiLGduaSRgMjAxNWApDQpnbmkkYDIwMTVgPC1nc3ViKCJzc3MiLCIiLGduaSRgMjAxNWApDQpnbmkkYDIwMTVgPC1nc3ViKCJ1dXUiLCIiLGduaSRgMjAxNWApDQpnbmkkYDIwMTVgPC1nc3ViKCJvIiwiIixnbmkkYDIwMTVgKQ0KZ25pJGAyMDE1YCA8LSBhcy5udW1lcmljKGduaSRgMjAxNWApDQoNCmduaSRgMjAxNGA8LWdzdWIoInR0dCIsIiIsZ25pJGAyMDE0YCkNCmduaSRgMjAxNGA8LWdzdWIoImZmIiwiIixnbmkkYDIwMTRgKQ0KZ25pJGAyMDE0YDwtZ3N1Yigic3NzIiwiIixnbmkkYDIwMTRgKQ0KZ25pJGAyMDE0YDwtZ3N1YigidXV1IiwiIixnbmkkYDIwMTRgKQ0KZ25pJGAyMDE0YDwtZ3N1YigibyIsIiIsZ25pJGAyMDE0YCkNCmduaSRgMjAxNGAgPC0gYXMubnVtZXJpYyhnbmkkYDIwMTRgKQ0KDQpnbmk8LWduaVssYygyLDIzOjI4KV0NCg0KZ25pPC1nYXRoZXIoYXMuZGF0YS5mcmFtZShnbmkpLGtleSA9ICJDb3VudHJ5IikNCm5hbWVzKGduaSkgPC0gYygiY250cnkiLCJ5ZWFyIiwiZ25pIikNCg0KZ25pJGNudHJ5PC1jb3VudHJ5Y29kZShnbmkkY250cnksImNvdW50cnkubmFtZSIsImNvdW50cnkubmFtZSIpDQpnbmkkY250cnllYXJzIDwtIHBhc3RlKGduaSRjbnRyeSxnbmkkeWVhcikNCg0KcGh5c2lnbmkgPC0gZ25pICU+JSBkcGx5cjo6c2VsZWN0KGNudHJ5ZWFycywgZ25pKQ0KDQpjb21iaW5lZCA8LSBtZXJnZShjb21iaW5lZCwgcGh5c2lnbmksIGJ5ID0gImNudHJ5ZWFycyIpDQoNCnBoeXNpZ25pMiA8LSBkZHBseShjb21iaW5lZCx+Y250cnksDQogICAgICAgICAgICAgICAgICAgIHN1bW1hcmlzZSxnbmlfYz1tZWFuKGduaSxuYS5ybT1UKSkNCg0KY29tYmluZWQgPC0gbWVyZ2UoY29tYmluZWQsIHBoeXNpZ25pMiwgYnkgPSAiY250cnkiKQ0KDQoNCg0KYGBgDQoNCg0KIyMjIFRvIERvIC0gUmVnaW9ucw0KDQpgYGB7cn0NCiAgbXV0YXRlKHJlZ2lvbnMgPSB2ZGVtc19zdWIgJT4lIA0KICAgICAgICAgICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoImVfcmVnaW9ucG9sIikpICU+JQ0KICAgICAgICAgICBzZWxlY3QoJzIwMDAnKSAlPiUgDQogICAgICAgICAgIG11dGF0ZShyZWdpb25zID0gZmN0X3JlY29kZShhcy5mYWN0b3IoYDIwMDBgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkUuIEV1cm9wZSBhbmQgQy4gQXNpYSAocG9zdC1Db21tdW5pc3QpIiA9ICIxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxhdGluIEFtZXJpY2EgJiBDYXJyaWJlYW4iID0gIjIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTUVOQSIgPSAiMyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdWItU2FoYXJhbiBBZnJpY2EiID0gIjQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVy4gRXVyb3BlIGFuZCBOLiBBbWVyaWNhIiA9ICI1IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvdXRoICYgRWFzdCBBc2lhICYgUGFjaWZpYyIgPSAiNiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTb3V0aCAmIEVhc3QgQXNpYSAmIFBhY2lmaWMiID0gIjciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU291dGggJiBFYXN0IEFzaWEgJiBQYWNpZmljIiA9ICI4IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvdXRoICYgRWFzdCBBc2lhICYgUGFjaWZpYyIgPSAiOSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMYXRpbiBBbWVyaWNhICYgQ2FycmliZWFuIiA9ICIxMCIpICAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNfZmFjdG9yKSkgICU+JQ0KICAgICAgICAgICBzZWxlY3QocmVnaW9ucykNCg0KDQp0YWJsZShyZWdpb25zKQ0KDQpyZWdpb25zMiA8LSB2ZGVtc19zdWIgJT4lIA0KICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgdmFsdWUudmFyPWMoImVfcmVnaW9ucG9sIikpICU+JQ0KICBzZWxlY3QoJzIwMDAnKSAlPiUgDQogIHRyYW5zbXV0ZShmY3RfcmVjb2RlKGFzLmZhY3RvcihgMjAwMGApLA0KICAgICAgICAgICAgICAgICAgICAgICAiRS4gRXVyb3BlIGFuZCBDLiBBc2lhIChwb3N0LUNvbW11bmlzdCkiID0gIjEiLA0KICAgICAgICAgICAgICAgICAgICAgICAiTGF0aW4gQW1lcmljYSAmIENhcnJpYmVhbiIgPSAiMiIsDQogICAgICAgICAgICAgICAgICAgICAgICJNRU5BIiA9ICIzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIlN1Yi1TYWhhcmFuIEFmcmljYSIgPSAiNCIsDQogICAgICAgICAgICAgICAgICAgICAgICJXLiBFdXJvcGUgYW5kIE4uIEFtZXJpY2EiID0gIjUiLA0KICAgICAgICAgICAgICAgICAgICAgICAiRWFzdCBBc2lhIiA9ICI2IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIlNvdXRoLUVhc3QgQXNpYSIgPSAiNyIsDQogICAgICAgICAgICAgICAgICAgICAgICJTb3V0aCBBc2lhIiA9ICI4IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIlBhY2lmaWMiID0gIjkiLA0KICAgICAgICAgICAgICAgICAgICAgICAiTGF0aW4gQW1lcmljYSAmIENhcnJpYmVhbiIgPSAiMTAiKSkNCg0KdGFibGUocmVnaW9uczIpDQoNCnJlZ2lvbnMzIDwtIGRjYXN0KHZkZW1zX3N1YiwgY291bnRyeV9uYW1lIH4geWVhciwgdmFsdWUudmFyPWMoImVfcmVnaW9ucG9sIikpJCIyMDAwIg0KDQpwb3N0Y29tICAgPC0gYXMubnVtZXJpYyhyZWdpb25zMyA9PSAxKQ0KbGF0aW4gICAgIDwtIGFzLm51bWVyaWMocmVnaW9uczMgPT0gMiB8IHJlZ2lvbnMzID09IDEwKQ0KbWVuYSAgICAgIDwtIGFzLm51bWVyaWMocmVnaW9uczMgPT0gMykNCnN1YnNhaGFyYSA8LSBhcy5udW1lcmljKHJlZ2lvbnMzID09IDQpDQp3ZXN0ICAgICAgPC0gYXMubnVtZXJpYyhyZWdpb25zMyA9PSA1KQ0KZS5hc2lhICAgIDwtIGFzLm51bWVyaWMocmVnaW9uczMgPT0gNikNCnMuZS5hc2lhICA8LSBhcy5udW1lcmljKHJlZ2lvbnMzID09IDcpDQpzLmFzaWEgICAgPC0gYXMubnVtZXJpYyhyZWdpb25zMyA9PSA4KQ0KcGFjaWZpYyAgIDwtIGFzLm51bWVyaWMocmVnaW9uczMgPT0gOSkNCg0KDQp3dyA8LSB2ZGVtc19zdWIgJT4lIA0KICBkY2FzdChjb3VudHJ5X25hbWUgfiB5ZWFyLCANCiAgICAgICAgICAgICAgICAgdmFsdWUudmFyPWMoImVfcmVnaW9ucG9sIikpICU+JQ0KICBzZWxlY3QoJzIwMDAnKSAlPiUgDQogIG11dGF0ZShyZWdpb25zID0gZmN0X3JlY29kZShhcy5mYWN0b3IoYDIwMDBgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkUuIEV1cm9wZSBhbmQgQy4gQXNpYSAocG9zdC1Db21tdW5pc3QpIiA9ICIxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxhdGluIEFtZXJpY2EgJiBDYXJyaWJlYW4iID0gIjIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTUVOQSIgPSAiMyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdWItU2FoYXJhbiBBZnJpY2EiID0gIjQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVy4gRXVyb3BlIGFuZCBOLiBBbWVyaWNhIiA9ICI1IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvdXRoICYgRWFzdCBBc2lhICYgUGFjaWZpYyIgPSAiNiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTb3V0aCAmIEVhc3QgQXNpYSAmIFBhY2lmaWMiID0gIjciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU291dGggJiBFYXN0IEFzaWEgJiBQYWNpZmljIiA9ICI4IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvdXRoICYgRWFzdCBBc2lhICYgUGFjaWZpYyIgPSAiOSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMYXRpbiBBbWVyaWNhICYgQ2FycmliZWFuIiA9ICIxMCIpKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzX2ZhY3RvcigpICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KHJlZ2lvbnMpDQoNCnd3DQoNCnJlZ2lvbnMyIDwtIHZkZW1zX3N1YiAlPiUgDQogIGRjYXN0KGNvdW50cnlfbmFtZSB+IHllYXIsIA0KICAgICAgICB2YWx1ZS52YXI9YygiZV9yZWdpb25wb2wiKSkgJT4lDQogIHNlbGVjdCgnMjAwMCcpICU+JSANCiAgdHJhbnNtdXRlKGZjdF9yZWNvZGUoYXMuZmFjdG9yKGAyMDAwYCksDQogICAgICAgICAgICAgICAgICAgICAgICJFLiBFdXJvcGUgYW5kIEMuIEFzaWEgKHBvc3QtQ29tbXVuaXN0KSIgPSAiMSIsDQogICAgICAgICAgICAgICAgICAgICAgICJMYXRpbiBBbWVyaWNhICYgQ2FycmliZWFuIiA9ICIyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIk1FTkEiID0gIjMiLA0KICAgICAgICAgICAgICAgICAgICAgICAiU3ViLVNhaGFyYW4gQWZyaWNhIiA9ICI0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIlcuIEV1cm9wZSBhbmQgTi4gQW1lcmljYSIgPSAiNSIsDQogICAgICAgICAgICAgICAgICAgICAgICJFYXN0IEFzaWEiID0gIjYiLA0KICAgICAgICAgICAgICAgICAgICAgICAiU291dGgtRWFzdCBBc2lhIiA9ICI3IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIlNvdXRoIEFzaWEiID0gIjgiLA0KICAgICAgICAgICAgICAgICAgICAgICAiUGFjaWZpYyIgPSAiOSIsDQogICAgICAgICAgICAgICAgICAgICAgICJMYXRpbiBBbWVyaWNhICYgQ2FycmliZWFuIiA9ICIxMCIpKQ0KDQp0YWJsZShyZWdpb25zMikNCg0KcmVnaW9uczMgPC0gZGNhc3QodmRlbXNfc3ViLCBjb3VudHJ5X25hbWUgfiB5ZWFyLCB2YWx1ZS52YXI9YygiZV9yZWdpb25wb2wiKSkkIjIwMDAiDQoNCnBvc3Rjb20gICA8LSBhcy5udW1lcmljKHJlZ2lvbnMzID09IDEpDQpsYXRpbiAgICAgPC0gYXMubnVtZXJpYyhyZWdpb25zMyA9PSAyIHwgcmVnaW9uczMgPT0gMTApDQptZW5hICAgICAgPC0gYXMubnVtZXJpYyhyZWdpb25zMyA9PSAzKQ0Kc3Vic2FoYXJhIDwtIGFzLm51bWVyaWMocmVnaW9uczMgPT0gNCkNCndlc3QgICAgICA8LSBhcy5udW1lcmljKHJlZ2lvbnMzID09IDUpDQplLmFzaWEgICAgPC0gYXMubnVtZXJpYyhyZWdpb25zMyA9PSA2KQ0Kcy5lLmFzaWEgIDwtIGFzLm51bWVyaWMocmVnaW9uczMgPT0gNykNCnMuYXNpYSAgICA8LSBhcy5udW1lcmljKHJlZ2lvbnMzID09IDgpDQpwYWNpZmljICAgPC0gYXMubnVtZXJpYyhyZWdpb25zMyA9PSA5KQ0KDQoNCg0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg==